From 6af160ee560d43f574ab017df7df4baca3fd8ded Mon Sep 17 00:00:00 2001 From: mluto Date: Fri, 29 Mar 2013 10:09:39 +0100 Subject: [PATCH 01/66] Fix #1519: don't error in listSessionsOfGroup when there are non-existing sessions (by eldiddio) --- src/node/db/SessionManager.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/node/db/SessionManager.js b/src/node/db/SessionManager.js index 60e0a7ac..571ea07b 100644 --- a/src/node/db/SessionManager.js +++ b/src/node/db/SessionManager.js @@ -347,7 +347,15 @@ function listSessionsWithDBKey (dbkey, callback) { exports.getSessionInfo(sessionID, function(err, sessionInfo) { - if(ERR(err, callback)) return; + if (err == "apierror: sessionID does not exist") + { + console.warn("Found bad session " + sessionID + " in " + dbkey + "."); + } + else if(ERR(err, callback)) + { + return; + } + sessions[sessionID] = sessionInfo; callback(); }); From 716e929e64492858dc7ad4d507820c869afed6ce Mon Sep 17 00:00:00 2001 From: John McLear Date: Sun, 29 Sep 2013 08:19:57 +0100 Subject: [PATCH 02/66] works but hides caret on full line and not on X too, X is much harder to do --- src/static/js/ace2_inner.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index f53e9de8..23c95c7d 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3597,6 +3597,26 @@ function Ace2Inner(){ return; } + // Is caret potentially hidden by the chat button? + var myselection = document.getSelection(); // get the current caret selection + var caretOffsetTop = myselection.focusNode.parentNode.offsetTop | myselection.focusNode.offsetTop; // get the carets selection offset in px IE 214 + + if(myselection.focusNode.wholeText){ // Is there any content? If not lineHeight will report wrong.. + var lineHeight = myselection.focusNode.parentNode.offsetHeight; // line height of populated links + }else{ + var lineHeight = myselection.focusNode.offsetHeight; // line height of blank lines + } + var heightOfChatIcon = parent.parent.$('#chaticon').height(); // height of the chat icon button + lineHeight = (lineHeight *2) + heightOfChatIcon; + var viewport = getViewPortTopBottom(); + var viewportHeight = viewport.bottom - viewport.top - lineHeight; + var relCaretOffsetTop = caretOffsetTop - viewport.top; // relative Caret Offset Top to viewport + if (viewportHeight < relCaretOffsetTop){ + parent.parent.$("#chaticon").css("opacity",".3"); // make chaticon opacity low when user types near it + }else{ + parent.parent.$("#chaticon").css("opacity","1"); // make chaticon opacity back to full (so fully visible) + } + //dmesg("keyevent type: "+type+", which: "+which); // Don't take action based on modifier keys going up and down. // Modifier keys do not generate "keypress" events. From 17f26b8c2c981ee993f812510d68751ca03637c3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 22 Jul 2014 15:46:31 +0100 Subject: [PATCH 03/66] Support to allow for a setting so you can stop unknown file types from being imported --- settings.json.template | 11 +++++++---- src/node/handler/ImportHandler.js | 11 ++++++++--- src/node/utils/Settings.js | 5 +++++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/settings.json.template b/settings.json.template index 5868af6a..359d1f8b 100644 --- a/settings.json.template +++ b/settings.json.template @@ -74,19 +74,22 @@ /* This is the path to the Abiword executable. Setting it to null, disables abiword. Abiword is needed to advanced import/export features of pads*/ "abiword" : null, + + /* Should we allow of file types other than the supported types: .html, .txt, .doc, .docx, .rtf, .ods */ + "allowUnknownFileEnds" : true, /* This setting is used if you require authentication of all users. Note: /admin always requires authentication. */ - "requireAuthentication": false, + "requireAuthentication" : false, /* Require authorization by a module, or a user with is_admin set, see below. */ - "requireAuthorization": false, + "requireAuthorization" : false, /*when you use NginX or another proxy/ load-balancer set this to true*/ - "trustProxy": false, + "trustProxy" : false, /* Privacy: disable IP logging */ - "disableIPlogging": false, + "disableIPlogging" : false, /* Users for basic authentication. is_admin = true gives access to /admin. If you do not uncomment this, /admin will not be available! */ diff --git a/src/node/handler/ImportHandler.js b/src/node/handler/ImportHandler.js index 60fa5ffb..8e724671 100644 --- a/src/node/handler/ImportHandler.js +++ b/src/node/handler/ImportHandler.js @@ -92,9 +92,14 @@ exports.doImport = function(req, res, padId) } //we need to rename this file with a .txt ending else { - var oldSrcFile = srcFile; - srcFile = path.join(path.dirname(srcFile),path.basename(srcFile, fileEnding)+".txt"); - fs.rename(oldSrcFile, srcFile, callback); + if(settings.allowUnknownFileEnds === true){ + var oldSrcFile = srcFile; + srcFile = path.join(path.dirname(srcFile),path.basename(srcFile, fileEnding)+".txt"); + fs.rename(oldSrcFile, srcFile, callback); + }else{ + console.warn("Not allowing unknown file type to be imported", fileEnding); + callback("uploadFailed"); + } } }, function(callback){ diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 8b17a6d3..bbebf0bd 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -129,6 +129,11 @@ exports.minify = true; */ exports.abiword = null; +/** + * Should we support none natively supported file types on import? + */ +exports.allowUnknownFileEnds = true; + /** * The log level of log4js */ From aa908ea8ce5ba7aab20a3d78324e4a01a2d49fe5 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 22 Jul 2014 16:02:22 +0100 Subject: [PATCH 04/66] tidy up template a bit --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index 359d1f8b..b55ca7e0 100644 --- a/settings.json.template +++ b/settings.json.template @@ -75,7 +75,7 @@ Abiword is needed to advanced import/export features of pads*/ "abiword" : null, - /* Should we allow of file types other than the supported types: .html, .txt, .doc, .docx, .rtf, .ods */ + /* Should we allow of file types other than the supported types: html, txt, doc, docx, rtf, odt, html & htm */ "allowUnknownFileEnds" : true, /* This setting is used if you require authentication of all users. From 6dfe33258a4a211d1b9723200a5e877835b56393 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 22 Jul 2014 16:02:56 +0100 Subject: [PATCH 05/66] tidy up template a bit --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index b55ca7e0..8b2a9c2a 100644 --- a/settings.json.template +++ b/settings.json.template @@ -75,7 +75,7 @@ Abiword is needed to advanced import/export features of pads*/ "abiword" : null, - /* Should we allow of file types other than the supported types: html, txt, doc, docx, rtf, odt, html & htm */ + /* Should we allow of file types other than the supported types: txt, doc, docx, rtf, odt, html & htm */ "allowUnknownFileEnds" : true, /* This setting is used if you require authentication of all users. From 95ab126fe23fa72ee8ee015b7b6da93407988f6e Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 22 Jul 2014 16:03:26 +0100 Subject: [PATCH 06/66] tidy up template a bit --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index 8b2a9c2a..5b4155bf 100644 --- a/settings.json.template +++ b/settings.json.template @@ -75,7 +75,7 @@ Abiword is needed to advanced import/export features of pads*/ "abiword" : null, - /* Should we allow of file types other than the supported types: txt, doc, docx, rtf, odt, html & htm */ + /* Should we allow import of file types other than the supported types: txt, doc, docx, rtf, odt, html & htm */ "allowUnknownFileEnds" : true, /* This setting is used if you require authentication of all users. From 83b7ca529bdce7741c69b9a7da958133180ec30f Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 22 Jul 2014 16:03:49 +0100 Subject: [PATCH 07/66] tidy up template a bit --- settings.json.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.json.template b/settings.json.template index 5b4155bf..3f84af9b 100644 --- a/settings.json.template +++ b/settings.json.template @@ -75,7 +75,7 @@ Abiword is needed to advanced import/export features of pads*/ "abiword" : null, - /* Should we allow import of file types other than the supported types: txt, doc, docx, rtf, odt, html & htm */ + /* Allow import of file types other than the supported types: txt, doc, docx, rtf, odt, html & htm */ "allowUnknownFileEnds" : true, /* This setting is used if you require authentication of all users. From 09acdda4f7e785a92eff0a6b6ef1f6b49397045b Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 14 Oct 2014 14:37:57 +0100 Subject: [PATCH 08/66] bump semver --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 18556aad..6e78884f 100644 --- a/src/package.json +++ b/src/package.json @@ -31,7 +31,7 @@ "ejs" : "0.6.1", "graceful-fs" : "1.1.5", "slide" : "1.1.3", - "semver" : "1.0.13", + "semver" : ">2.3.0", "security" : "1.0.0", "tinycon" : "0.0.1", "underscore" : "1.3.1", From 9c2f8808bee84b818e5ba636b20bf9d605e87495 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 14 Oct 2014 14:38:47 +0100 Subject: [PATCH 09/66] bump swagger --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 6e78884f..edc44be9 100644 --- a/src/package.json +++ b/src/package.json @@ -37,7 +37,7 @@ "underscore" : "1.3.1", "unorm" : "1.0.0", "languages4translatewiki" : "0.1.3", - "swagger-node-express" : "1.2.3", + "swagger-node-express" : ">=2.1.0", "channels" : "0.0.x", "jsonminify" : "0.2.2", "measured" : "0.1.3" From 226e0bf0e39fd91e114f7020ba1dfaf1dae351c5 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 14 Oct 2014 14:41:18 +0100 Subject: [PATCH 10/66] bump resolve --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index edc44be9..24e27332 100644 --- a/src/package.json +++ b/src/package.json @@ -14,7 +14,7 @@ "yajsml" : "1.1.6", "request" : "2.9.100", "require-kernel" : "1.0.5", - "resolve" : "0.2.x", + "resolve" : ">=1.0.0", "socket.io" : "0.9.x", "ueberDB" : ">=0.2.2", "express" : "3.1.0", From ac2e949c3ef1e73b19f3a8bdcd1575ed563311f0 Mon Sep 17 00:00:00 2001 From: John McLear Date: Fri, 24 Oct 2014 00:13:34 +0100 Subject: [PATCH 11/66] chrome browser change wrapping type --- src/static/js/ace2_inner.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index fb6dd080..6a37ac7a 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -152,7 +152,6 @@ function Ace2Inner(){ var dmesg = noop; window.dmesg = noop; - var scheduler = parent; // hack for opera required var textFace = 'monospace'; @@ -597,6 +596,13 @@ function Ace2Inner(){ fixView(); }); }, 0); + + // Chrome can't handle the truth.. If CSS rule white-space:pre-wrap + // is true then any paste event will insert two lines.. + if(browser.chrome){ + $("#innerdocbody").css({"white-space":"normal"}); + } + } function setStyled(newVal) From 9a01f905ebe7814db3d49e14b4703bcb47d91c17 Mon Sep 17 00:00:00 2001 From: Trevor Alexander Date: Tue, 28 Oct 2014 13:07:02 -1000 Subject: [PATCH 12/66] Added explicit reference to plugins and themes in readme --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 71c0b3e1..4b739729 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,10 @@ You can initially modify the settings in `settings.json`. (If you need to handle You should use a dedicated database such as "mysql", if you are planning on using etherpad-in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes. +## Plugins and themes + +Etherpad is very customizable through plugins. Instructions for installing themes and plugins can be found [here](https://github.com/ether/etherpad-lite/wiki/Available-Plugins). + ## Helpful resources The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages. From 69b17f508876731c415a40690650645c69ae64e4 Mon Sep 17 00:00:00 2001 From: talexand Date: Tue, 28 Oct 2014 15:13:05 -1000 Subject: [PATCH 13/66] changed link wording for readme plugin reference --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b739729..3ed1077f 100644 --- a/README.md +++ b/README.md @@ -76,7 +76,7 @@ You should use a dedicated database such as "mysql", if you are planning on usin ## Plugins and themes -Etherpad is very customizable through plugins. Instructions for installing themes and plugins can be found [here](https://github.com/ether/etherpad-lite/wiki/Available-Plugins). +Etherpad is very customizable through plugins. Instructions for installing themes and plugins can be found in [the plugin wiki article](https://github.com/ether/etherpad-lite/wiki/Available-Plugins). ## Helpful resources The [wiki](https://github.com/ether/etherpad-lite/wiki) is your one-stop resource for Tutorials and How-to's, really check it out! Also, feel free to improve these wiki pages. From 3ebcaad31fc217e8ef77c940d414cb55ea99fa6d Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 1 Nov 2014 12:36:57 +0000 Subject: [PATCH 14/66] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 34a824ff..c5186dec 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,7 @@ You'll need gzip, git, curl, libssl develop libraries, python and gcc. *For Fedora/CentOS*: `yum install gzip git-core curl python openssl-devel && yum groupinstall "Development Tools"` *For FreeBSD*: `portinstall node, npm, git (optional)` -Additionally, you'll need [node.js](http://nodejs.org) installed, Ideally the latest stable version, be careful of installing nodejs from apt. +Additionally, you'll need [node.js](http://nodejs.org) installed, Ideally the latest stable version, we recommend installing/compiling nodejs from source (avoiding apt). **As any user (we recommend creating a separate user called etherpad):** From a22b558a2c3659b7b374e262e9a6bf01c0821c36 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 1 Nov 2014 20:21:48 +0000 Subject: [PATCH 15/66] change to proper IE check --- src/static/js/pad.js | 2 +- src/static/js/pad_utils.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 73fcd3d6..0f5fbe72 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -67,7 +67,7 @@ function createCookie(name, value, days, path){ /* Warning Internet Explorer doe } //Check if the browser is IE and if so make sure the full path is set in the cookie - if(navigator.appName=='Microsoft Internet Explorer'){ + if((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))){ document.cookie = name + "=" + value + expires + "; path="+document.location; } else{ diff --git a/src/static/js/pad_utils.js b/src/static/js/pad_utils.js index 343e5fce..ff60ca7c 100644 --- a/src/static/js/pad_utils.js +++ b/src/static/js/pad_utils.js @@ -55,7 +55,7 @@ function createCookie(name, value, days, path){ /* Used by IE */ } //Check if the browser is IE and if so make sure the full path is set in the cookie - if(navigator.appName=='Microsoft Internet Explorer'){ + if((navigator.appName == 'Microsoft Internet Explorer') || ((navigator.appName == 'Netscape') && (new RegExp("Trident/.*rv:([0-9]{1,}[\.0-9]{0,})").exec(navigator.userAgent) != null))){ document.cookie = name + "=" + value + expires + "; path=/"; /* Note this bodge fix for IE is temporary until auth is rewritten */ } else{ From a67e805da0f356cb584aa338c7c448d1969eb577 Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 1 Nov 2014 21:25:49 +0000 Subject: [PATCH 16/66] basics, still not working --- src/node/hooks/express/socketio.js | 2 ++ src/package.json | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/node/hooks/express/socketio.js b/src/node/hooks/express/socketio.js index 524bab3d..39b32580 100644 --- a/src/node/hooks/express/socketio.js +++ b/src/node/hooks/express/socketio.js @@ -42,6 +42,7 @@ exports.expressCreateServer = function (hook_name, args, cb) { io.set('transports', settings.socketTransportProtocols ); var socketIOLogger = log4js.getLogger("socket.io"); + /* io.set('logger', { debug: function (str) { @@ -60,6 +61,7 @@ exports.expressCreateServer = function (hook_name, args, cb) { socketIOLogger.error.apply(socketIOLogger, arguments); }, }); + */ //minify socket.io javascript if(settings.minify) diff --git a/src/package.json b/src/package.json index 652aebaf..1adbe891 100644 --- a/src/package.json +++ b/src/package.json @@ -15,7 +15,7 @@ "request" : "2.9.100", "require-kernel" : "1.0.5", "resolve" : ">=1.0.0", - "socket.io" : "0.9.x", + "socket.io" : ">=1.2.0", "ueberDB" : ">=0.2.6", "express" : "3.1.0", "async" : "0.1.x", From 2c801cc558bd358d1de6a0cdfcd3de8201739f7b Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 1 Nov 2014 22:36:19 +0000 Subject: [PATCH 17/66] no errors but no connections --- src/node/hooks/express/socketio.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/node/hooks/express/socketio.js b/src/node/hooks/express/socketio.js index 39b32580..17ce3864 100644 --- a/src/node/hooks/express/socketio.js +++ b/src/node/hooks/express/socketio.js @@ -16,6 +16,7 @@ exports.expressCreateServer = function (hook_name, args, cb) { /* Require an express session cookie to be present, and load the * session. See http://www.danielbaulig.de/socket-ioexpress for more * info */ + /* io.set('authorization', function (data, accept) { if (!data.headers.cookie) return accept('No session cookie transmitted.', false); @@ -35,11 +36,12 @@ exports.expressCreateServer = function (hook_name, args, cb) { }); }); }); + */ // there shouldn't be a browser that isn't compatible to all // transports in this list at once // e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling - io.set('transports', settings.socketTransportProtocols ); + // io.set('transports', settings.socketTransportProtocols ); var socketIOLogger = log4js.getLogger("socket.io"); /* @@ -65,7 +67,7 @@ exports.expressCreateServer = function (hook_name, args, cb) { //minify socket.io javascript if(settings.minify) - io.enable('browser client minification'); + // io.enable('browser client minification'); //Initalize the Socket.IO Router socketIORouter.setSocketIO(io); From c7061e47db8aa7828461fc3344e69a6b4dc6d319 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 17:06:47 +0000 Subject: [PATCH 18/66] use request and a remote ep plugin only endpoint --- src/static/js/pluginfw/installer.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 9f7ac939..7480e152 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -1,6 +1,7 @@ var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); var npm = require("npm"); +var request = require("request"); var npmIsLoaded = false; var withNpm = function (npmfn) { @@ -60,17 +61,16 @@ exports.availablePlugins = null; var cacheTimestamp = 0; exports.getAvailablePlugins = function(maxCacheAge, cb) { - withNpm(function (er) { + request("http://etherpad.org/plugins.json", function(er, response, plugins){ if (er) return cb && cb(er); if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) { return cb && cb(null, exports.availablePlugins) } - npm.commands.search(['ep_'], /*silent?*/true, function(er, results) { - if(er) return cb && cb(er); - exports.availablePlugins = results; + console.log("plugins", plugins); + plugins = JSON.parse(plugins); + exports.availablePlugins = plugins; cacheTimestamp = Math.round(+new Date/1000); - cb && cb(null, results) - }) + cb && cb(null, plugins) }); }; From 1e53c4f5f0440b00a30037793783f862f3cced7d Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 17:57:18 +0000 Subject: [PATCH 19/66] identify which parts are causing issues and comment them out, obviously this needs fixing --- src/node/handler/PadMessageHandler.js | 8 +++++++- src/node/handler/SocketIORouter.js | 6 ++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index e1ac994e..c81c9d17 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1015,6 +1015,7 @@ function handleClientReady(client, message) return callback(); //Check if this author is already on the pad, if yes, kick the other sessions! +/* var roomClients = socketio.sockets.clients(padIds.padId); for(var i = 0; i < roomClients.length; i++) { var sinfo = sessioninfos[roomClients[i].id]; @@ -1025,6 +1026,7 @@ function handleClientReady(client, message) roomClients[i].json.send({disconnect:"userdup"}); } } +*/ //Save in sessioninfos that this session belonges to this pad sessioninfos[client.id].padId = padIds.padId; @@ -1032,6 +1034,7 @@ function handleClientReady(client, message) sessioninfos[client.id].readonly = padIds.readonly; //Log creation/(re-)entering of a pad +/* client.get('remoteAddress', function(er, ip) { //Anonymize the IP address if IP logging is disabled if(settings.disableIPlogging) { @@ -1045,6 +1048,7 @@ function handleClientReady(client, message) accessLogger.info('[CREATE] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" created the pad'); } }) +*/ //If this is a reconnect, we don't have to send the client the ClientVars again if(message.reconnect == true) @@ -1100,7 +1104,7 @@ function handleClientReady(client, message) // tell the client the number of the latest chat-message, which will be // used to request the latest 100 chat-messages later (GET_CHAT_MESSAGES) "chatHead": pad.chatHead, - "numConnectedUsers": roomClients.length, + "numConnectedUsers": 0, "readOnlyId": padIds.readOnlyPadId, "readonly": padIds.readonly, "serverTimestamp": new Date().getTime(), @@ -1165,6 +1169,7 @@ function handleClientReady(client, message) client.broadcast.to(padIds.padId).json.send(messageToTheOtherUsers); //Run trough all sessions of this pad +/* async.forEach(socketio.sockets.clients(padIds.padId), function(roomClient, callback) { var author; @@ -1211,6 +1216,7 @@ function handleClientReady(client, message) } ], callback); }, callback); +*/ } ],function(err) { diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index b3e046d2..96260254 100644 --- a/src/node/handler/SocketIORouter.js +++ b/src/node/handler/SocketIORouter.js @@ -56,11 +56,13 @@ exports.setSocketIO = function(_socket) { socket.sockets.on('connection', function(client) { + +// Broken: See http://stackoverflow.com/questions/4647348/send-message-to-specific-client-with-socket-io-and-node-js if(settings.trustProxy && client.handshake.headers['x-forwarded-for'] !== undefined){ - client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); +// client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); } else{ - client.set('remoteAddress', client.handshake.address.address); +// client.set('remoteAddress', client.handshake.address); } var clientAuthorized = false; From adef0af227a765b8d2ddfece29449bf6b4053313 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 18:01:41 +0000 Subject: [PATCH 20/66] more stuff required to stop it crashing, now we have identified what needs fixing we can fix it --- src/node/handler/PadMessageHandler.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index c81c9d17..da2a7a14 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -115,6 +115,7 @@ exports.handleDisconnect = function(client) //if this connection was already etablished with a handshake, send a disconnect message to the others if(session && session.author) { + /* client.get('remoteAddress', function(er, ip) { //Anonymize the IP address if IP logging is disabled if(settings.disableIPlogging) { @@ -123,6 +124,7 @@ exports.handleDisconnect = function(client) accessLogger.info('[LEAVE] Pad "'+session.padId+'": Author "'+session.author+'" on client '+client.id+' with IP "'+ip+'" left the pad') }) + */ //get the author color out of the db authorManager.getAuthorColorId(session.author, function(err, color) @@ -752,6 +754,7 @@ function handleUserChanges(data, cb) exports.updatePadClients = function(pad, callback) { + /* //skip this step if noone is on this pad var roomClients = socketio.sockets.clients(pad.id); if(roomClients.length==0) @@ -827,6 +830,7 @@ exports.updatePadClients = function(pad, callback) callback ); },callback); + */ } /** From 5d0ccb5f8f7b029ed71b0cd5bc668a3fe088a96f Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 18:17:39 +0000 Subject: [PATCH 21/66] auth fix --- src/node/hooks/express/socketio.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/node/hooks/express/socketio.js b/src/node/hooks/express/socketio.js index 17ce3864..32c5fd88 100644 --- a/src/node/hooks/express/socketio.js +++ b/src/node/hooks/express/socketio.js @@ -16,8 +16,9 @@ exports.expressCreateServer = function (hook_name, args, cb) { /* Require an express session cookie to be present, and load the * session. See http://www.danielbaulig.de/socket-ioexpress for more * info */ - /* - io.set('authorization', function (data, accept) { + + io.use(function(socket, accept) { + var data = socket.request; if (!data.headers.cookie) return accept('No session cookie transmitted.', false); // Use connect's cookie parser, because it knows how to parse signed cookies @@ -36,7 +37,6 @@ exports.expressCreateServer = function (hook_name, args, cb) { }); }); }); - */ // there shouldn't be a browser that isn't compatible to all // transports in this list at once From cb28d109631e7bd5357fcd754b60fd89e820e7e6 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 18:32:26 +0000 Subject: [PATCH 22/66] move logging into debug environment variable .. sighs --- src/node/utils/Settings.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index c455617b..1f22ccfd 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -228,6 +228,7 @@ exports.reloadSettings = function reloadSettings() { log4js.configure(exports.logconfig);//Configure the logging appenders log4js.setGlobalLogLevel(exports.loglevel);//set loglevel + process.env['DEBUG'] = 'socket.io:' + exports.loglevel; // Used by SocketIO for Debug log4js.replaceConsole(); if(!exports.sessionKey){ // If the secretKey isn't set we also create yet another unique value here From 95e7b0f15609fc850b71717a672abd02237a0f33 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 19:11:06 +0000 Subject: [PATCH 23/66] transports --- src/node/hooks/express/socketio.js | 39 +++++++++--------------------- 1 file changed, 12 insertions(+), 27 deletions(-) diff --git a/src/node/hooks/express/socketio.js b/src/node/hooks/express/socketio.js index 32c5fd88..98146bbb 100644 --- a/src/node/hooks/express/socketio.js +++ b/src/node/hooks/express/socketio.js @@ -1,10 +1,17 @@ var log4js = require('log4js'); -var socketio = require('socket.io'); var settings = require('../../utils/Settings'); var socketIORouter = require("../../handler/SocketIORouter"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks"); var webaccess = require("ep_etherpad-lite/node/hooks/express/webaccess"); +// there shouldn't be a browser that isn't compatible to all +// transports in this list at once +// e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling + +var socketio = require('socket.io')({ + transports: settings.socketTransportProtocols +}); + var padMessageHandler = require("../../handler/PadMessageHandler"); var connect = require('connect'); @@ -38,32 +45,10 @@ exports.expressCreateServer = function (hook_name, args, cb) { }); }); - // there shouldn't be a browser that isn't compatible to all - // transports in this list at once - // e.g. XHR is disabled in IE by default, so in IE it should use jsonp-polling - // io.set('transports', settings.socketTransportProtocols ); - - var socketIOLogger = log4js.getLogger("socket.io"); - /* - io.set('logger', { - debug: function (str) - { - socketIOLogger.debug.apply(socketIOLogger, arguments); - }, - info: function (str) - { - socketIOLogger.info.apply(socketIOLogger, arguments); - }, - warn: function (str) - { - socketIOLogger.warn.apply(socketIOLogger, arguments); - }, - error: function (str) - { - socketIOLogger.error.apply(socketIOLogger, arguments); - }, - }); - */ + // var socketIOLogger = log4js.getLogger("socket.io"); + // Debug logging now has to be set at an environment level, this is stupid. + // https://github.com/Automattic/socket.io/wiki/Migrating-to-1.0 + // This debug logging environment is set in Settings.js //minify socket.io javascript if(settings.minify) From 68eaa09708241b0551f5d345f45d8f7ba00913d2 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 19:55:05 +0000 Subject: [PATCH 24/66] Begin to repair damage done to rooms logic --- src/node/handler/PadMessageHandler.js | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index da2a7a14..2072a784 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -754,9 +754,14 @@ function handleUserChanges(data, cb) exports.updatePadClients = function(pad, callback) { - /* //skip this step if noone is on this pad - var roomClients = socketio.sockets.clients(pad.id); + var roomClients = [], room = socketio.sockets.adapter.rooms[pad.id]; + if (room) { + for (var id in room) { + roomClients.push(socketio.sockets.adapter.nsp.connected[id]); + } + } + if(roomClients.length==0) return callback(); @@ -769,10 +774,8 @@ exports.updatePadClients = function(pad, callback) var revCache = {}; //go trough all sessions on this pad - async.forEach(roomClients, function(client, callback) - { + async.forEach(roomClients, function(client, callback){ var sid = client.id; - //https://github.com/caolan/async#whilst //send them all new changesets async.whilst( @@ -802,7 +805,8 @@ exports.updatePadClients = function(pad, callback) if(author == sessioninfos[sid].author) { - client.json.send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); + // client.json.send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); + socketio.in(pad).send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); } else { @@ -817,7 +821,9 @@ exports.updatePadClients = function(pad, callback) timeDelta: currentTime - sessioninfos[sid].time }}; - client.json.send(wireMsg); + // client.json.send(wireMsg); + socketio.in(pad).send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); + } sessioninfos[sid].time = currentTime; @@ -830,7 +836,6 @@ exports.updatePadClients = function(pad, callback) callback ); },callback); - */ } /** From a6cbb4af409b5448e2b27d4f28234efd8c0e3c17 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 19:58:38 +0000 Subject: [PATCH 25/66] working messages --- src/node/handler/PadMessageHandler.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 2072a784..0dc18d7e 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -805,8 +805,7 @@ exports.updatePadClients = function(pad, callback) if(author == sessioninfos[sid].author) { - // client.json.send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); - socketio.in(pad).send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); + client.json.send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); } else { @@ -821,9 +820,7 @@ exports.updatePadClients = function(pad, callback) timeDelta: currentTime - sessioninfos[sid].time }}; - // client.json.send(wireMsg); - socketio.in(pad).send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}}); - + client.json.send(wireMsg); } sessioninfos[sid].time = currentTime; From 8391f902fbda5f687bb9efd3152352ddcdc11a81 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 22:31:09 +0000 Subject: [PATCH 26/66] re-apply roomsize --- src/node/handler/PadMessageHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 0dc18d7e..af83dfac 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1110,7 +1110,7 @@ function handleClientReady(client, message) // tell the client the number of the latest chat-message, which will be // used to request the latest 100 chat-messages later (GET_CHAT_MESSAGES) "chatHead": pad.chatHead, - "numConnectedUsers": 0, + "numConnectedUsers": roomClients.length, "readOnlyId": padIds.readOnlyPadId, "readonly": padIds.readonly, "serverTimestamp": new Date().getTime(), From af3e8e5e15b66ccae2306ba6b956d8acd8143eed Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 22:34:43 +0000 Subject: [PATCH 27/66] fix room client leave --- src/node/handler/PadMessageHandler.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index af83dfac..8657460c 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1021,8 +1021,13 @@ function handleClientReady(client, message) return callback(); //Check if this author is already on the pad, if yes, kick the other sessions! -/* - var roomClients = socketio.sockets.clients(padIds.padId); + var roomClients = [], room = socketio.sockets.adapter.rooms[pad.id]; + if (room) { + for (var id in room) { + roomClients.push(socketio.sockets.adapter.nsp.connected[id]); + } + } + for(var i = 0; i < roomClients.length; i++) { var sinfo = sessioninfos[roomClients[i].id]; if(sinfo && sinfo.author == author) { @@ -1032,7 +1037,6 @@ function handleClientReady(client, message) roomClients[i].json.send({disconnect:"userdup"}); } } -*/ //Save in sessioninfos that this session belonges to this pad sessioninfos[client.id].padId = padIds.padId; From f418dfa2053c4b40bd46d586b960a2de8167388c Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 22:37:10 +0000 Subject: [PATCH 28/66] fix author notification handler --- src/node/handler/PadMessageHandler.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 8657460c..3c39c4d8 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1179,8 +1179,14 @@ function handleClientReady(client, message) client.broadcast.to(padIds.padId).json.send(messageToTheOtherUsers); //Run trough all sessions of this pad -/* - async.forEach(socketio.sockets.clients(padIds.padId), function(roomClient, callback) + var roomClients = [], room = socketio.sockets.adapter.rooms[pad.id]; + if (room) { + for (var id in room) { + roomClients.push(socketio.sockets.adapter.nsp.connected[id]); + } + } + + async.forEach(roomClients, function(roomClient, callback) { var author; @@ -1226,7 +1232,6 @@ function handleClientReady(client, message) } ], callback); }, callback); -*/ } ],function(err) { From 9fa77cdea251b5e32a351298bbe97a88abec3e56 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 23:25:18 +0000 Subject: [PATCH 29/66] working handling of setting client ip and anonymizing etc --- src/node/handler/PadMessageHandler.js | 21 ++++++++++++--------- src/node/handler/SocketIORouter.js | 9 ++++++--- src/node/hooks/express/socketio.js | 8 +++++--- src/node/utils/RemoteAddress.js | 1 + 4 files changed, 24 insertions(+), 15 deletions(-) create mode 100644 src/node/utils/RemoteAddress.js diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 3c39c4d8..b4e6243f 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -37,6 +37,7 @@ var _ = require('underscore'); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); var channels = require("channels"); var stats = require('../stats'); +var remoteAddress = require("../utils/RemoteAddress").remoteAddress; /** * A associative array that saves informations about a session @@ -115,16 +116,18 @@ exports.handleDisconnect = function(client) //if this connection was already etablished with a handshake, send a disconnect message to the others if(session && session.author) { - /* - client.get('remoteAddress', function(er, ip) { - //Anonymize the IP address if IP logging is disabled - if(settings.disableIPlogging) { - ip = 'ANONYMOUS'; - } - accessLogger.info('[LEAVE] Pad "'+session.padId+'": Author "'+session.author+'" on client '+client.id+' with IP "'+ip+'" left the pad') - }) - */ +console.log(remoteAddress); + + // Get the IP address from our persistant object + var ip = remoteAddress[client.id]; + + // Anonymize the IP address if IP logging is disabled + if(settings.disableIPlogging) { + ip = 'ANONYMOUS'; + } + + accessLogger.info('[LEAVE] Pad "'+session.padId+'": Author "'+session.author+'" on client '+client.id+' with IP "'+ip+'" left the pad') //get the author color out of the db authorManager.getAuthorColorId(session.author, function(err, color) diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index 96260254..0a7361f4 100644 --- a/src/node/handler/SocketIORouter.js +++ b/src/node/handler/SocketIORouter.js @@ -24,6 +24,7 @@ var log4js = require('log4js'); var messageLogger = log4js.getLogger("message"); var securityManager = require("../db/SecurityManager"); var readOnlyManager = require("../db/ReadOnlyManager"); +var remoteAddress = require("../utils/RemoteAddress").remoteAddress; var settings = require('../utils/Settings'); /** @@ -57,12 +58,14 @@ exports.setSocketIO = function(_socket) { socket.sockets.on('connection', function(client) { -// Broken: See http://stackoverflow.com/questions/4647348/send-message-to-specific-client-with-socket-io-and-node-js + // Broken: See http://stackoverflow.com/questions/4647348/send-message-to-specific-client-with-socket-io-and-node-js + // Fixed by having a persistant object, ideally this would actually be in the database layer + // TODO move to database layer if(settings.trustProxy && client.handshake.headers['x-forwarded-for'] !== undefined){ -// client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); + remoteAddress[client.id] = client.handshake.headers['x-forwarded-for']; } else{ -// client.set('remoteAddress', client.handshake.address); + remoteAddress[client.id] = client.handshake.address; } var clientAuthorized = false; diff --git a/src/node/hooks/express/socketio.js b/src/node/hooks/express/socketio.js index 98146bbb..e88a3f4c 100644 --- a/src/node/hooks/express/socketio.js +++ b/src/node/hooks/express/socketio.js @@ -51,9 +51,11 @@ exports.expressCreateServer = function (hook_name, args, cb) { // This debug logging environment is set in Settings.js //minify socket.io javascript - if(settings.minify) - // io.enable('browser client minification'); - + // Due to a shitty decision by the SocketIO team minification is + // no longer available, details available at: + // http://stackoverflow.com/questions/23981741/minify-socket-io-socket-io-js-with-1-0 + // if(settings.minify) io.enable('browser client minification'); + //Initalize the Socket.IO Router socketIORouter.setSocketIO(io); socketIORouter.addComponent("pad", padMessageHandler); diff --git a/src/node/utils/RemoteAddress.js b/src/node/utils/RemoteAddress.js new file mode 100644 index 00000000..86a4a5b2 --- /dev/null +++ b/src/node/utils/RemoteAddress.js @@ -0,0 +1 @@ +exports.remoteAddress = {}; From 053ff3097d097ad89337740a0209c50f4726399d Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 23:29:45 +0000 Subject: [PATCH 30/66] whoops I missed this one --- src/node/handler/PadMessageHandler.js | 28 ++++++++++++--------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index b4e6243f..36da4842 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -117,8 +117,6 @@ exports.handleDisconnect = function(client) if(session && session.author) { -console.log(remoteAddress); - // Get the IP address from our persistant object var ip = remoteAddress[client.id]; @@ -1047,21 +1045,19 @@ function handleClientReady(client, message) sessioninfos[client.id].readonly = padIds.readonly; //Log creation/(re-)entering of a pad -/* - client.get('remoteAddress', function(er, ip) { - //Anonymize the IP address if IP logging is disabled - if(settings.disableIPlogging) { - ip = 'ANONYMOUS'; - } + var ip = remoteAddress[client.id]; - if(pad.head > 0) { - accessLogger.info('[ENTER] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" entered the pad'); - } - else if(pad.head == 0) { - accessLogger.info('[CREATE] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" created the pad'); - } - }) -*/ + //Anonymize the IP address if IP logging is disabled + if(settings.disableIPlogging) { + ip = 'ANONYMOUS'; + } + + if(pad.head > 0) { + accessLogger.info('[ENTER] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" entered the pad'); + } + else if(pad.head == 0) { + accessLogger.info('[CREATE] Pad "'+padIds.padId+'": Client '+client.id+' with IP "'+ip+'" created the pad'); + } //If this is a reconnect, we don't have to send the client the ClientVars again if(message.reconnect == true) From 57f56d8fe11ee28b9f3f2a1e969f86038ca27d34 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Nov 2014 23:42:40 +0000 Subject: [PATCH 31/66] bump express to a working version --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 1adbe891..4639abcf 100644 --- a/src/package.json +++ b/src/package.json @@ -17,7 +17,7 @@ "resolve" : ">=1.0.0", "socket.io" : ">=1.2.0", "ueberDB" : ">=0.2.6", - "express" : "3.1.0", + "express" : ">3.1.0 <3.9.0", "async" : "0.1.x", "connect" : "2.7.x", "clean-css" : "0.3.2", From 7d04d7309f872dca337c8a648aff9f1aee5cd370 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 6 Nov 2014 14:32:20 +0000 Subject: [PATCH 32/66] reflow buttons based on browser size, much better --- src/static/css/pad.css | 43 +++++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 599b9fd4..228c035f 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -59,7 +59,7 @@ a img { height: 32px; } .toolbar ul { - position: relative; + position: absolute; list-style: none; padding-right: 3px; padding-left: 1px; @@ -67,9 +67,6 @@ a img { overflow: hidden; float: left } -.toolbar ul.menu_right { - float: right -} .toolbar ul li { float: left; margin-left: 2px; @@ -84,6 +81,7 @@ a img { visibility: hidden; width: 0px; padding: 5px; + height:20px; } .toolbar ul li a:hover { text-decoration: none; @@ -164,6 +162,15 @@ a img { border: 1px solid #ccc; outline: none; } +.toolbar ul.menu_left { + left:0px; + right:250px; +} + +.toolbar ul.menu_right { + right:0px; +} + li[data-key=showusers] > a { min-width: 30px; text-align: left; @@ -843,12 +850,16 @@ input[type=checkbox] { width: 185px !important; } @media screen and (max-width: 600px) { - .toolbar ul li.separator { - display: none; - } - .toolbar ul li a { - padding: 4px 1px - } + .toolbar ul li.separator { + display: none; + } + .toolbar ul li a { + padding: 4px 1px + } + .toolbar ul.menu_left { + left:0px; + right:150px; + } } @media all and (max-width: 400px){ #gritter-notice-wrapper{ @@ -894,9 +905,13 @@ input[type=checkbox] { #editbar { height: 62px; } + .toolbar ul.menu_left { + left:0px; + right:100px; + } + .toolbar ul.menu_right { - float: left; - margin-top:2px; + right:0px; } .popup { width:100%; @@ -917,6 +932,8 @@ input[type=checkbox] { #editorcontainer { margin-bottom: 33px } + .toolbar ul.menu_left { + } .toolbar ul.menu_right { background: #f7f7f7; background: -webkit-linear-gradient(#f7f7f7, #f1f1f1 80%); @@ -1076,4 +1093,4 @@ input[type=checkbox] { text-shadow: none; } -/* End of gritter stuff */ \ No newline at end of file +/* End of gritter stuff */ From 9170effb27dee076ac7401a34f0e857be50330eb Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 6 Nov 2014 15:09:44 +0000 Subject: [PATCH 33/66] working redraw and draw on startup --- src/static/js/pad.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 73fcd3d6..5292e75d 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -370,6 +370,18 @@ function handshake() $('#readonlyinput').on('click',function(){ padeditbar.setEmbedLinks(); }); + // Listen for resize events (sucks but needed as iFrame ace_inner has to be position absolute + // A CSS fix for this would be nice but I'm not sure how we'd do it. + $(window).resize(function(){ + redrawEditbar(); + }); + redrawEditbar(); +} + +var redrawEditbar = function(){ + var height = $('.menu_left').height() + 4 + "px"; + $('#editbar').css("height", height); + $('#editorcontainer').css("top", height); } $.extend($.gritter.options, { @@ -937,4 +949,3 @@ exports.handshake = handshake; exports.pad = pad; exports.init = init; exports.alertBar = alertBar; - From 96d6e7c1b7df59e96c394608a343cb698c848576 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 6 Nov 2014 15:12:40 +0000 Subject: [PATCH 34/66] cleaner reflow --- src/static/js/pad.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 5292e75d..6a3a2e0e 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -379,9 +379,10 @@ function handshake() } var redrawEditbar = function(){ - var height = $('.menu_left').height() + 4 + "px"; - $('#editbar').css("height", height); - $('#editorcontainer').css("top", height); + var editbarHeight = $('.menu_left').height() + 2 + "px"; + var containerTop = $('.menu_left').height() + 5 + "px"; + $('#editbar').css("height", editbarHeight); + $('#editorcontainer').css("top", containerTop); } $.extend($.gritter.options, { From 0685e563ed947a42377fe1a5eb6fca10f3e8e833 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 6 Nov 2014 15:43:21 +0000 Subject: [PATCH 35/66] working on resize --- src/static/css/pad.css | 1 + src/static/js/pad.js | 13 ------------- src/static/js/pad_editbar.js | 15 ++++++++++++++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 228c035f..11705e06 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -933,6 +933,7 @@ input[type=checkbox] { margin-bottom: 33px } .toolbar ul.menu_left { + right:0px; } .toolbar ul.menu_right { background: #f7f7f7; diff --git a/src/static/js/pad.js b/src/static/js/pad.js index 6a3a2e0e..649d8c82 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -370,19 +370,6 @@ function handshake() $('#readonlyinput').on('click',function(){ padeditbar.setEmbedLinks(); }); - // Listen for resize events (sucks but needed as iFrame ace_inner has to be position absolute - // A CSS fix for this would be nice but I'm not sure how we'd do it. - $(window).resize(function(){ - redrawEditbar(); - }); - redrawEditbar(); -} - -var redrawEditbar = function(){ - var editbarHeight = $('.menu_left').height() + 2 + "px"; - var containerTop = $('.menu_left').height() + 5 + "px"; - $('#editbar').css("height", editbarHeight); - $('#editorcontainer').css("top", containerTop); } $.extend($.gritter.options, { diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index 6352b129..c067bbba 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -140,7 +140,12 @@ var padeditbar = (function() init: function() { var self = this; self.dropdowns = []; - + // Listen for resize events (sucks but needed as iFrame ace_inner has to be position absolute + // A CSS fix for this would be nice but I'm not sure how we'd do it. + $(window).resize(function(){ + self.redrawHeight(); + }); + $("#editbar .editbarbutton").attr("unselectable", "on"); // for IE $("#editbar").removeClass("disabledtoolbar").addClass("enabledtoolbar"); $("#editbar [data-key]").each(function () { @@ -149,6 +154,8 @@ var padeditbar = (function() }); }); + this.redrawHeight(); + registerDefaultCommands(self); hooks.callAll("postToolbarInit", { @@ -170,6 +177,12 @@ var padeditbar = (function() this.commands[cmd] = callback; return this; }, + redrawHeight: function(){ + var editbarHeight = $('.menu_left').height() + 2 + "px"; + var containerTop = $('.menu_left').height() + 5 + "px"; + $('#editbar').css("height", editbarHeight); + $('#editorcontainer').css("top", containerTop); + }, registerDropdownCommand: function (cmd, dropdown) { dropdown = dropdown || cmd; self.dropdowns.push(dropdown) From d13b6162f0b7869942ec4bcb6ab7b5267b448b86 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 6 Nov 2014 15:50:55 +0000 Subject: [PATCH 36/66] this looks way better --- src/static/css/pad.css | 3 +++ src/static/js/pad_editbar.js | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 11705e06..91c97c5e 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -182,6 +182,9 @@ li[data-key=showusers] > a #online_count { top: 2px; padding-left: 2px; } +#editbar{ + display:none; +} #editorcontainer { position: absolute; top: 37px; /* + 1px border */ diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index c067bbba..d39bfecd 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -154,6 +154,8 @@ var padeditbar = (function() }); }); + $('#editbar').show(); + this.redrawHeight(); registerDefaultCommands(self); From fc5152c2f3199ec6056fc97a04eda3afd733eae0 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 6 Nov 2014 17:38:38 +0000 Subject: [PATCH 37/66] remove logging --- src/static/js/pluginfw/installer.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index 7480e152..c1a9adad 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -66,7 +66,6 @@ exports.getAvailablePlugins = function(maxCacheAge, cb) { if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) { return cb && cb(null, exports.availablePlugins) } - console.log("plugins", plugins); plugins = JSON.parse(plugins); exports.availablePlugins = plugins; cacheTimestamp = Math.round(+new Date/1000); From d246a191c6cc9a6e2d84451058e2252f7c552095 Mon Sep 17 00:00:00 2001 From: Cristo Date: Sat, 8 Nov 2014 01:12:40 +0100 Subject: [PATCH 38/66] Added option to restore revisions #1791 --- src/node/db/API.js | 98 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/src/node/db/API.js b/src/node/db/API.js index 4a912368..2aadc483 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -576,6 +576,104 @@ exports.deletePad = function(padID, callback) }); } +exports.restoreRevision = function(padID, rev, callback) +{ + var Changeset = require("ep_etherpad-lite/static/js/Changeset"); + + //check if rev is a number + if(rev !== undefined && typeof rev != "number") + { + //try to parse the number + if(!isNaN(parseInt(rev))) + { + rev = parseInt(rev); + } + else + { + callback(new customError("rev is not a number", "apierror")); + return; + } + } + + //ensure this is not a negativ number + if(rev !== undefined && rev < 0) + { + callback(new customError("rev is a negativ number","apierror")); + return; + } + + //ensure this is not a float value + if(rev !== undefined && !is_int(rev)) + { + callback(new customError("rev is a float value","apierror")); + return; + } + + //get the pad + getPadSafe(padID, true, function(err, pad) + { + if(ERR(err, callback)) return; + + + //check if this is a valid revision + if(rev > pad.getHeadRevisionNumber()) + { + callback(new customError("rev is higher than the head revision of the pad","apierror")); + return; + } + + pad.getInternalRevisionAText(rev, function(err, atext) + { + if(ERR(err, callback)) return; + + var oldText = pad.text(); + atext.text += "\n"; + function eachAttribRun(attribs, func) + { + var attribsIter = Changeset.opIterator(attribs); + var textIndex = 0; + var newTextStart = 0; + var newTextEnd = atext.text.length; + while (attribsIter.hasNext()) + { + var op = attribsIter.next(); + var nextIndex = textIndex + op.chars; + if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) + { + func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs); + } + textIndex = nextIndex; + } + } + + // create a new changeset with a helper builder object + var builder = Changeset.builder(oldText.length); + + // assemble each line into the builder + eachAttribRun(atext.attribs, function(start, end, attribs) + { + builder.insert(atext.text.substring(start, end), attribs); + }); + + var lastNewlinePos = oldText.lastIndexOf('\n'); + if (lastNewlinePos < 0) { + builder.remove(oldText.length-1,0); + } else { + builder.remove(lastNewlinePos, oldText.match(/\n/g).length-1); + builder.remove(oldText.length - lastNewlinePos-1,0); + } + + var changeset = builder.toString(); + + //append the changeset + pad.appendRevision(changeset); + // + callback(null, changeset); + }); + + }); +}; + /** copyPad(sourceID, destinationID[, force=false]) copies a pad. If force is true, the destination will be overwritten if it exists. From c33c6e085ec533056cb5bf75dc76350e9cdf03ba Mon Sep 17 00:00:00 2001 From: Cristo Date: Sat, 8 Nov 2014 01:39:27 +0100 Subject: [PATCH 39/66] comment addded --- src/node/db/API.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 2aadc483..8ad6e2eb 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -575,7 +575,14 @@ exports.deletePad = function(padID, callback) pad.remove(callback); }); } +/** + restoreRevision(padID, [rev]) Restores revision from past as new changeset + Example returns: + + {code:0, message:"ok", data:null} + {code: 1, message:"padID does not exist", data: null} + */ exports.restoreRevision = function(padID, rev, callback) { var Changeset = require("ep_etherpad-lite/static/js/Changeset"); @@ -668,7 +675,7 @@ exports.restoreRevision = function(padID, rev, callback) //append the changeset pad.appendRevision(changeset); // - callback(null, changeset); + callback(null, null); }); }); From 46bc328896877630169c4cea60431be981859352 Mon Sep 17 00:00:00 2001 From: Cristo Date: Sat, 8 Nov 2014 01:41:23 +0100 Subject: [PATCH 40/66] new api ver --- src/node/handler/APIHandler.js | 48 +++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index 273a58a6..76af4aa1 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -345,10 +345,56 @@ var version = , "getChatHistory" : ["padID", "start", "end"] , "getChatHead" : ["padID"] } + , "1.2.11": + { "createGroup" : [] + , "createGroupIfNotExistsFor" : ["groupMapper"] + , "deleteGroup" : ["groupID"] + , "listPads" : ["groupID"] + , "listAllPads" : [] + , "createDiffHTML" : ["padID", "startRev", "endRev"] + , "createPad" : ["padID", "text"] + , "createGroupPad" : ["groupID", "padName", "text"] + , "createAuthor" : ["name"] + , "createAuthorIfNotExistsFor": ["authorMapper" , "name"] + , "listPadsOfAuthor" : ["authorID"] + , "createSession" : ["groupID", "authorID", "validUntil"] + , "deleteSession" : ["sessionID"] + , "getSessionInfo" : ["sessionID"] + , "listSessionsOfGroup" : ["groupID"] + , "listSessionsOfAuthor" : ["authorID"] + , "getText" : ["padID", "rev"] + , "setText" : ["padID", "text"] + , "getHTML" : ["padID", "rev"] + , "setHTML" : ["padID", "html"] + , "getAttributePool" : ["padID"] + , "getRevisionsCount" : ["padID"] + , "getRevisionChangeset" : ["padID", "rev"] + , "getLastEdited" : ["padID"] + , "deletePad" : ["padID"] + , "copyPad" : ["sourceID", "destinationID", "force"] + , "movePad" : ["sourceID", "destinationID", "force"] + , "getReadOnlyID" : ["padID"] + , "getPadID" : ["roID"] + , "setPublicStatus" : ["padID", "publicStatus"] + , "getPublicStatus" : ["padID"] + , "setPassword" : ["padID", "password"] + , "isPasswordProtected" : ["padID"] + , "listAuthorsOfPad" : ["padID"] + , "padUsersCount" : ["padID"] + , "getAuthorName" : ["authorID"] + , "padUsers" : ["padID"] + , "sendClientsMessage" : ["padID", "msg"] + , "listAllGroups" : [] + , "checkToken" : [] + , "getChatHistory" : ["padID"] + , "getChatHistory" : ["padID", "start", "end"] + , "getChatHead" : ["padID"] + , "restoreRevision" : ["padID", "rev"] + } }; // set the latest available API version here -exports.latestApiVersion = '1.2.10'; +exports.latestApiVersion = '1.2.11'; // exports the versions so it can be used by the new Swagger endpoint exports.version = version; From 9d39c9591adab5b6638e16ee54e7f87a9147e015 Mon Sep 17 00:00:00 2001 From: Cristo Date: Wed, 12 Nov 2014 19:46:50 +0100 Subject: [PATCH 41/66] update pad clients --- src/node/db/API.js | 170 +++++++++++++++++++++++---------------------- 1 file changed, 88 insertions(+), 82 deletions(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 8ad6e2eb..b3d46ea1 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -583,102 +583,108 @@ exports.deletePad = function(padID, callback) {code:0, message:"ok", data:null} {code: 1, message:"padID does not exist", data: null} */ -exports.restoreRevision = function(padID, rev, callback) +exports.restoreRevision = function (padID, rev, callback) { - var Changeset = require("ep_etherpad-lite/static/js/Changeset"); - - //check if rev is a number - if(rev !== undefined && typeof rev != "number") - { - //try to parse the number - if(!isNaN(parseInt(rev))) - { - rev = parseInt(rev); - } - else - { - callback(new customError("rev is not a number", "apierror")); - return; - } - } + var Changeset = require("ep_etherpad-lite/static/js/Changeset"); + var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js"); - //ensure this is not a negativ number - if(rev !== undefined && rev < 0) - { - callback(new customError("rev is a negativ number","apierror")); - return; - } + //check if rev is a number + if (rev !== undefined && typeof rev != "number") + { + //try to parse the number + if (!isNaN(parseInt(rev))) + { + rev = parseInt(rev); + } + else + { + callback(new customError("rev is not a number", "apierror")); + return; + } + } - //ensure this is not a float value - if(rev !== undefined && !is_int(rev)) - { - callback(new customError("rev is a float value","apierror")); - return; - } + //ensure this is not a negativ number + if (rev !== undefined && rev < 0) + { + callback(new customError("rev is a negativ number", "apierror")); + return; + } - //get the pad - getPadSafe(padID, true, function(err, pad) - { - if(ERR(err, callback)) return; + //ensure this is not a float value + if (rev !== undefined && !is_int(rev)) + { + callback(new customError("rev is a float value", "apierror")); + return; + } + + //get the pad + getPadSafe(padID, true, function (err, pad) + { + if (ERR(err, callback)) return; - //check if this is a valid revision - if(rev > pad.getHeadRevisionNumber()) - { - callback(new customError("rev is higher than the head revision of the pad","apierror")); - return; - } + //check if this is a valid revision + if (rev > pad.getHeadRevisionNumber()) + { + callback(new customError("rev is higher than the head revision of the pad", "apierror")); + return; + } - pad.getInternalRevisionAText(rev, function(err, atext) - { - if(ERR(err, callback)) return; + pad.getInternalRevisionAText(rev, function (err, atext) + { + if (ERR(err, callback)) return; - var oldText = pad.text(); - atext.text += "\n"; - function eachAttribRun(attribs, func) - { - var attribsIter = Changeset.opIterator(attribs); - var textIndex = 0; - var newTextStart = 0; - var newTextEnd = atext.text.length; - while (attribsIter.hasNext()) - { - var op = attribsIter.next(); - var nextIndex = textIndex + op.chars; - if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) - { - func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs); - } - textIndex = nextIndex; - } - } + var oldText = pad.text(); + atext.text += "\n"; + function eachAttribRun(attribs, func) + { + var attribsIter = Changeset.opIterator(attribs); + var textIndex = 0; + var newTextStart = 0; + var newTextEnd = atext.text.length; + while (attribsIter.hasNext()) + { + var op = attribsIter.next(); + var nextIndex = textIndex + op.chars; + if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) + { + func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs); + } + textIndex = nextIndex; + } + } - // create a new changeset with a helper builder object - var builder = Changeset.builder(oldText.length); + // create a new changeset with a helper builder object + var builder = Changeset.builder(oldText.length); - // assemble each line into the builder - eachAttribRun(atext.attribs, function(start, end, attribs) - { - builder.insert(atext.text.substring(start, end), attribs); - }); + // assemble each line into the builder + eachAttribRun(atext.attribs, function (start, end, attribs) + { + builder.insert(atext.text.substring(start, end), attribs); + }); - var lastNewlinePos = oldText.lastIndexOf('\n'); - if (lastNewlinePos < 0) { - builder.remove(oldText.length-1,0); - } else { - builder.remove(lastNewlinePos, oldText.match(/\n/g).length-1); - builder.remove(oldText.length - lastNewlinePos-1,0); - } + var lastNewlinePos = oldText.lastIndexOf('\n'); + if (lastNewlinePos < 0) + { + builder.remove(oldText.length - 1, 0); + } else + { + builder.remove(lastNewlinePos, oldText.match(/\n/g).length - 1); + builder.remove(oldText.length - lastNewlinePos - 1, 0); + } - var changeset = builder.toString(); + var changeset = builder.toString(); - //append the changeset - pad.appendRevision(changeset); - // - callback(null, null); - }); + //append the changeset + pad.appendRevision(changeset); + // + padMessage.updatePadClients(pad, function () + { + }); + callback(null, null); + }); - }); + }); }; /** From 24ac082cae6ad8842d3028a14ec9ecb8bbd47b9a Mon Sep 17 00:00:00 2001 From: Cristo Date: Wed, 12 Nov 2014 19:49:08 +0100 Subject: [PATCH 42/66] Update API.js --- src/node/db/API.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index b3d46ea1..d933f99e 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -587,7 +587,6 @@ exports.restoreRevision = function (padID, rev, callback) { var Changeset = require("ep_etherpad-lite/static/js/Changeset"); var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js"); - //check if rev is a number if (rev !== undefined && typeof rev != "number") { From f59238fe58ac1d1a28896642a86f8483a0d524a3 Mon Sep 17 00:00:00 2001 From: Cristo Date: Wed, 12 Nov 2014 19:50:43 +0100 Subject: [PATCH 43/66] Update API.js --- src/node/db/API.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index d933f99e..2ba99f6a 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -587,6 +587,7 @@ exports.restoreRevision = function (padID, rev, callback) { var Changeset = require("ep_etherpad-lite/static/js/Changeset"); var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js"); + //check if rev is a number if (rev !== undefined && typeof rev != "number") { @@ -682,7 +683,6 @@ exports.restoreRevision = function (padID, rev, callback) }); callback(null, null); }); - }); }; From f7dd756642623ade815f417de7b7b2eb880e488c Mon Sep 17 00:00:00 2001 From: Cristo Date: Wed, 12 Nov 2014 19:53:56 +0100 Subject: [PATCH 44/66] Update API.js --- src/node/db/API.js | 173 +++++++++++++++++++++++---------------------- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 2ba99f6a..07d3703c 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -585,105 +585,106 @@ exports.deletePad = function(padID, callback) */ exports.restoreRevision = function (padID, rev, callback) { - var Changeset = require("ep_etherpad-lite/static/js/Changeset"); - var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js"); + var Changeset = require("ep_etherpad-lite/static/js/Changeset"); + var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js"); - //check if rev is a number - if (rev !== undefined && typeof rev != "number") - { - //try to parse the number - if (!isNaN(parseInt(rev))) - { - rev = parseInt(rev); - } - else - { - callback(new customError("rev is not a number", "apierror")); - return; - } - } + //check if rev is a number + if (rev !== undefined && typeof rev != "number") + { + //try to parse the number + if (!isNaN(parseInt(rev))) + { + rev = parseInt(rev); + } + else + { + callback(new customError("rev is not a number", "apierror")); + return; + } + } - //ensure this is not a negativ number - if (rev !== undefined && rev < 0) - { - callback(new customError("rev is a negativ number", "apierror")); - return; - } + //ensure this is not a negativ number + if (rev !== undefined && rev < 0) + { + callback(new customError("rev is a negativ number", "apierror")); + return; + } - //ensure this is not a float value - if (rev !== undefined && !is_int(rev)) - { - callback(new customError("rev is a float value", "apierror")); - return; - } + //ensure this is not a float value + if (rev !== undefined && !is_int(rev)) + { + callback(new customError("rev is a float value", "apierror")); + return; + } - //get the pad - getPadSafe(padID, true, function (err, pad) - { - if (ERR(err, callback)) return; + //get the pad + getPadSafe(padID, true, function (err, pad) + { + if (ERR(err, callback)) return; - //check if this is a valid revision - if (rev > pad.getHeadRevisionNumber()) - { - callback(new customError("rev is higher than the head revision of the pad", "apierror")); - return; - } + //check if this is a valid revision + if (rev > pad.getHeadRevisionNumber()) + { + callback(new customError("rev is higher than the head revision of the pad", "apierror")); + return; + } - pad.getInternalRevisionAText(rev, function (err, atext) - { - if (ERR(err, callback)) return; + pad.getInternalRevisionAText(rev, function (err, atext) + { + if (ERR(err, callback)) return; - var oldText = pad.text(); - atext.text += "\n"; - function eachAttribRun(attribs, func) - { - var attribsIter = Changeset.opIterator(attribs); - var textIndex = 0; - var newTextStart = 0; - var newTextEnd = atext.text.length; - while (attribsIter.hasNext()) - { - var op = attribsIter.next(); - var nextIndex = textIndex + op.chars; - if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) - { - func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs); - } - textIndex = nextIndex; - } - } + var oldText = pad.text(); + atext.text += "\n"; + function eachAttribRun(attribs, func) + { + var attribsIter = Changeset.opIterator(attribs); + var textIndex = 0; + var newTextStart = 0; + var newTextEnd = atext.text.length; + while (attribsIter.hasNext()) + { + var op = attribsIter.next(); + var nextIndex = textIndex + op.chars; + if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) + { + func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs); + } + textIndex = nextIndex; + } + } - // create a new changeset with a helper builder object - var builder = Changeset.builder(oldText.length); + // create a new changeset with a helper builder object + var builder = Changeset.builder(oldText.length); - // assemble each line into the builder - eachAttribRun(atext.attribs, function (start, end, attribs) - { - builder.insert(atext.text.substring(start, end), attribs); - }); + // assemble each line into the builder + eachAttribRun(atext.attribs, function (start, end, attribs) + { + builder.insert(atext.text.substring(start, end), attribs); + }); - var lastNewlinePos = oldText.lastIndexOf('\n'); - if (lastNewlinePos < 0) - { - builder.remove(oldText.length - 1, 0); - } else - { - builder.remove(lastNewlinePos, oldText.match(/\n/g).length - 1); - builder.remove(oldText.length - lastNewlinePos - 1, 0); - } + var lastNewlinePos = oldText.lastIndexOf('\n'); + if (lastNewlinePos < 0) + { + builder.remove(oldText.length - 1, 0); + } else + { + builder.remove(lastNewlinePos, oldText.match(/\n/g).length - 1); + builder.remove(oldText.length - lastNewlinePos - 1, 0); + } - var changeset = builder.toString(); + var changeset = builder.toString(); - //append the changeset - pad.appendRevision(changeset); - // - padMessage.updatePadClients(pad, function () - { - }); - callback(null, null); - }); - }); + //append the changeset + pad.appendRevision(changeset); + // + padMessage.updatePadClients(pad, function () + { + }); + callback(null, null); + }); + + }); }; /** From 0253156dbb2e26a1a894a414c61ff8e521b3fece Mon Sep 17 00:00:00 2001 From: Cristo Date: Wed, 12 Nov 2014 19:55:37 +0100 Subject: [PATCH 45/66] Update APIHandler.js --- src/node/handler/APIHandler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index 76af4aa1..9adc2418 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -345,7 +345,7 @@ var version = , "getChatHistory" : ["padID", "start", "end"] , "getChatHead" : ["padID"] } - , "1.2.11": +, "1.2.11": { "createGroup" : [] , "createGroupIfNotExistsFor" : ["groupMapper"] , "deleteGroup" : ["groupID"] From e5d77c3763d28baa26b07d9cc7a1bdc59384f7f0 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 12 Nov 2014 21:39:03 +0000 Subject: [PATCH 46/66] indentation --- src/static/js/pluginfw/installer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index c1a9adad..bf779d7a 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -67,9 +67,9 @@ exports.getAvailablePlugins = function(maxCacheAge, cb) { return cb && cb(null, exports.availablePlugins) } plugins = JSON.parse(plugins); - exports.availablePlugins = plugins; - cacheTimestamp = Math.round(+new Date/1000); - cb && cb(null, plugins) + exports.availablePlugins = plugins; + cacheTimestamp = Math.round(+new Date/1000); + cb && cb(null, plugins) }); }; From e8fda27ead8bb550b027b9578199e2b034e388d1 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Fri, 14 Nov 2014 13:42:39 +0100 Subject: [PATCH 47/66] Localisation updates from https://translatewiki.net. --- src/locales/de.json | 6 +++--- src/locales/it.json | 9 +++++---- src/locales/lb.json | 4 ++-- src/locales/mk.json | 6 +++--- src/locales/sv.json | 14 +++++++------- src/locales/vi.json | 9 +++++---- src/locales/zh-hant.json | 8 ++++---- 7 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/locales/de.json b/src/locales/de.json index 05a9af79..25594da1 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -12,9 +12,9 @@ "pad.toolbar.bold.title": "Fett (Strg-B)", "pad.toolbar.italic.title": "Kursiv (Strg-I)", "pad.toolbar.underline.title": "Unterstrichen (Strg-U)", - "pad.toolbar.strikethrough.title": "Durchgestrichen", - "pad.toolbar.ol.title": "Nummerierte Liste", - "pad.toolbar.ul.title": "Ungeordnete Liste", + "pad.toolbar.strikethrough.title": "Durchgestrichen (Strg+5)", + "pad.toolbar.ol.title": "Nummerierte Liste (Strg+Shift+N)", + "pad.toolbar.ul.title": "Ungeordnete Liste (Strg+Shift+L)", "pad.toolbar.indent.title": "Einrücken (TAB)", "pad.toolbar.unindent.title": "Ausrücken (Shift+TAB)", "pad.toolbar.undo.title": "Rückgängig (Strg-Z)", diff --git a/src/locales/it.json b/src/locales/it.json index 8292c4f2..501733f8 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -4,7 +4,8 @@ "Beta16", "Gianfranco", "Muxator", - "Vituzzu" + "Vituzzu", + "Macofe" ] }, "index.newPad": "Nuovo Pad", @@ -12,9 +13,9 @@ "pad.toolbar.bold.title": "Grassetto (Ctrl-B)", "pad.toolbar.italic.title": "Corsivo (Ctrl-I)", "pad.toolbar.underline.title": "Sottolineato (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Barrato", - "pad.toolbar.ol.title": "Elenco numerato", - "pad.toolbar.ul.title": "Elenco puntato", + "pad.toolbar.strikethrough.title": "Barrato (Ctrl+5)", + "pad.toolbar.ol.title": "Elenco numerato (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Elenco puntato (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Rientro (TAB)", "pad.toolbar.unindent.title": "Riduci rientro (Shift+TAB)", "pad.toolbar.undo.title": "Annulla (Ctrl-Z)", diff --git a/src/locales/lb.json b/src/locales/lb.json index 7f936906..841add75 100644 --- a/src/locales/lb.json +++ b/src/locales/lb.json @@ -6,8 +6,8 @@ ] }, "index.newPad": "Neie Pad", - "pad.toolbar.ol.title": "Numeréiert Lëscht", - "pad.toolbar.ul.title": "Net-numeréiert Lëscht", + "pad.toolbar.ol.title": "Numeréiert Lëscht (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Net-numeréiert Lëscht (Ctrl+Shift+L)", "pad.toolbar.undo.title": "Réckgängeg (Ctrl-Z)", "pad.toolbar.redo.title": "Widderhuelen (Ctrl-Y)", "pad.toolbar.savedRevision.title": "Versioun späicheren", diff --git a/src/locales/mk.json b/src/locales/mk.json index 8aaf9917..aec40b27 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -10,9 +10,9 @@ "pad.toolbar.bold.title": "Задебелено (Ctrl-B)", "pad.toolbar.italic.title": "Косо (Ctrl-I)", "pad.toolbar.underline.title": "Подвлечено (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Прецртано", - "pad.toolbar.ol.title": "Подреден список", - "pad.toolbar.ul.title": "Неподреден список", + "pad.toolbar.strikethrough.title": "Прецртано (Ctrl+5)", + "pad.toolbar.ol.title": "Подреден список (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Неподреден список (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Вовлекување (TAB)", "pad.toolbar.unindent.title": "Отстап (Shift+TAB)", "pad.toolbar.undo.title": "Врати (Ctrl-Z)", diff --git a/src/locales/sv.json b/src/locales/sv.json index 623def9a..ab6f3820 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -11,9 +11,9 @@ "pad.toolbar.bold.title": "Fet (Ctrl-B)", "pad.toolbar.italic.title": "Kursiv (Ctrl-I)", "pad.toolbar.underline.title": "Understruken (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Genomstruken", - "pad.toolbar.ol.title": "Numrerad lista", - "pad.toolbar.ul.title": "Osorterad lista", + "pad.toolbar.strikethrough.title": "Genomstruken (Ctrl+5)", + "pad.toolbar.ol.title": "Numrerad lista (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Onumrerad lista (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Öka indrag (TABB)", "pad.toolbar.unindent.title": "Minska indrag (Shift+TABB)", "pad.toolbar.undo.title": "Ångra (Ctrl-Z)", @@ -52,7 +52,7 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Du kan endast importera från oformaterad text eller html-format. För mer avancerade importeringsfunktioner, var god installera abiword.", + "pad.importExport.abiword.innerHTML": "Du kan endast importera från oformaterad text eller HTML-format. För mer avancerade importeringsfunktioner, var god installera abiword.", "pad.modals.connected": "Ansluten.", "pad.modals.reconnecting": "Återansluter till ditt block...", "pad.modals.forcereconnect": "Tvinga återanslutning", @@ -60,7 +60,7 @@ "pad.modals.userdup.explanation": "Detta block verkar vara öppet i mer än ett fönster på denna dator.", "pad.modals.userdup.advice": "Återanslut för att använda detta fönster istället.", "pad.modals.unauth": "Inte godkänd", - "pad.modals.unauth.explanation": "Din behörighet ändrades medan du visar denna sida. Försök att återansluta.", + "pad.modals.unauth.explanation": "Din behörighet ändrades medan du visade denna sida. Försök att återansluta.", "pad.modals.looping.explanation": "Kommunikationsproblem med synkroniseringsservern har uppstått.", "pad.modals.looping.cause": "Kanske du är ansluten via en inkompatibel brandvägg eller proxy.", "pad.modals.initsocketfail": "Servern kan inte nås.", @@ -69,7 +69,7 @@ "pad.modals.slowcommit.explanation": "Servern svarar inte.", "pad.modals.slowcommit.cause": "Detta kan bero på problem med nätverksanslutningen.", "pad.modals.badChangeset.explanation": "En redigering som du gjort klassificerades som otillåten av synkroniseringsservern.", - "pad.modals.badChangeset.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänstadministratören om du anser att detta är ett fel. Försök ansluta igen för att fortsätta redigera.", + "pad.modals.badChangeset.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänsteadministratören om du upplever att detta är ett fel. Försök att ansluta igen för att fortsätta redigera.", "pad.modals.corruptPad.explanation": "Blocket du försöker komma åt är skadat.", "pad.modals.corruptPad.cause": "Detta kan bero på en felaktig konfiguration av servern eller något annat oväntad beteende. Var god kontakta tjänstadministratören.", "pad.modals.deleted": "Raderad.", @@ -84,7 +84,7 @@ "pad.chat": "Chatt", "pad.chat.title": "Öppna chatten för detta block.", "pad.chat.loadmessages": "Läs in fler meddelanden", - "timeslider.pageTitle": "Tidsreglage för {{appTitle}}", + "timeslider.pageTitle": "{{appTitle}} tidsreglage", "timeslider.toolbar.returnbutton": "Återvänd till blocket", "timeslider.toolbar.authors": "Författare:", "timeslider.toolbar.authorsList": "Inga författare", diff --git a/src/locales/vi.json b/src/locales/vi.json index 608e9645..3d5cb66d 100644 --- a/src/locales/vi.json +++ b/src/locales/vi.json @@ -3,7 +3,8 @@ "authors": [ "Baonguyen21022003", "Minh Nguyen", - "Tuankiet65" + "Tuankiet65", + "Max20091" ] }, "index.newPad": "Tạo một Pad mới", @@ -11,9 +12,9 @@ "pad.toolbar.bold.title": "In đậm (Ctrl-B)", "pad.toolbar.italic.title": "In nghiêng (Ctrl-I)", "pad.toolbar.underline.title": "Gạch chân (Ctrl-U)", - "pad.toolbar.strikethrough.title": "Gạch ngang", - "pad.toolbar.ol.title": "Danh sách Có Đánh số", - "pad.toolbar.ul.title": "Danh sách Không Đánh số", + "pad.toolbar.strikethrough.title": "Gạch ngang (Ctrl+5)", + "pad.toolbar.ol.title": "Danh sách Có Đánh số (Ctrl+Shift+N)", + "pad.toolbar.ul.title": "Danh sách Không Đánh số (Ctrl+Shift+L)", "pad.toolbar.indent.title": "Tăng lề (TAB)", "pad.toolbar.unindent.title": "Giảm lề (Shift+TAB)", "pad.toolbar.undo.title": "Hoàn tác (Ctrl-Z)", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index 0707648a..3b084e3d 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -14,9 +14,9 @@ "pad.toolbar.bold.title": "粗體(Ctrl-B)", "pad.toolbar.italic.title": "斜體(Ctrl-I)", "pad.toolbar.underline.title": "底線(Ctrl-U)", - "pad.toolbar.strikethrough.title": "刪除線", - "pad.toolbar.ol.title": "有序清單", - "pad.toolbar.ul.title": "無序清單", + "pad.toolbar.strikethrough.title": "刪除線(Ctrl+5)", + "pad.toolbar.ol.title": "有序清單(Ctrl+Shift+N)", + "pad.toolbar.ul.title": "無序清單(Ctrl+Shift+L)", "pad.toolbar.indent.title": "縮排(TAB)", "pad.toolbar.unindent.title": "凸排(Shift+TAB)", "pad.toolbar.undo.title": "撤銷(Ctrl-Z)", @@ -94,7 +94,7 @@ "timeslider.toolbar.exportlink.title": "匯出", "timeslider.exportCurrent": "匯出當前版本為:", "timeslider.version": "版本{{version}}", - "timeslider.saved": "{{year}}年{{month}}月{{day}}日儲存", + "timeslider.saved": "{{year}}年{{month}}{{day}}日儲存", "timeslider.dateformat": "{{year}}年{{month}}月{{day}}日 {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "1月", "timeslider.month.february": "2月", From d7a181be677362dd993c91e6f57fc51803439cb9 Mon Sep 17 00:00:00 2001 From: Simon Gaeremynck Date: Fri, 24 May 2013 09:12:51 +0100 Subject: [PATCH 48/66] Nooping console.foo in html10n.js when the method is not defined. --- src/static/js/html10n.js | 48 +++++++++++++++------------------------- 1 file changed, 18 insertions(+), 30 deletions(-) diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index 49a0a80d..19cf9de1 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -23,28 +23,16 @@ window.html10n = (function(window, document, undefined) { // fix console - var console = window.console - function interceptConsole(method){ - if (!console) return function() {} - - var original = console[method] - - // do sneaky stuff - if (original.bind){ - // Do this for normal browsers - return original.bind(console) - }else{ - return function() { - // Do this for IE - var message = Array.prototype.slice.apply(arguments).join(' ') - original(message) - } + (function() { + var noop = function() {}; + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"]; + var console = (window.console = window.console || {}); + for (var i = 0; i < names.length; ++i) { + if (!console[names[i]]) { + console[names[i]] = noop; } - } - var consoleLog = interceptConsole('log') - , consoleWarn = interceptConsole('warn') - , consoleError = interceptConsole('warn') - + } + }()); // fix Array#forEach in IE // taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach @@ -148,7 +136,7 @@ window.html10n = (function(window, document, undefined) { for (var i=0, n=this.resources.length; i < n; i++) { this.fetch(this.resources[i], lang, function(e) { reqs++; - if(e) consoleWarn(e) + if(e) console.warn(e) if (reqs < n) return;// Call back once all reqs are completed cb && cb() @@ -647,7 +635,7 @@ window.html10n = (function(window, document, undefined) { // return a function that gives the plural form name for a given integer var index = locales2rules[lang.replace(/-.*$/, '')]; if (!(index in pluralRules)) { - consoleWarn('plural form unknown for [' + lang + ']'); + console.warn('plural form unknown for [' + lang + ']'); return function() { return 'other'; }; } return pluralRules[index]; @@ -727,7 +715,7 @@ window.html10n = (function(window, document, undefined) { var i = 0 , n = list.length iterator(list[i], i, function each(err) { - if(err) consoleLog(err) + if(err) console.error(err) i++ if (i < n) return iterator(list[i],i, each); cb() @@ -750,8 +738,8 @@ window.html10n = (function(window, document, undefined) { html10n.get = function(id, args) { var translations = html10n.translations - if(!translations) return consoleWarn('No translations available (yet)') - if(!translations[id]) return consoleWarn('Could not find string '+id) + if(!translations) return console.warn('No translations available (yet)') + if(!translations[id]) return console.warn('Could not find string '+id) // apply macros var str = translations[id] @@ -781,7 +769,7 @@ window.html10n = (function(window, document, undefined) { } else if (arg in translations) { sub = translations[arg] } else { - consoleWarn('Could not find argument {{' + arg + '}}') + console.warn('Could not find argument {{' + arg + '}}') return str } @@ -840,7 +828,7 @@ window.html10n = (function(window, document, undefined) { str.id = node.getAttribute('data-l10n-id') if (!str.id) return - if(!translations[str.id]) return consoleWarn('Couldn\'t find translation key '+str.id) + if(!translations[str.id]) return console.warn('Couldn\'t find translation key '+str.id) // get args if(window.JSON) { @@ -849,7 +837,7 @@ window.html10n = (function(window, document, undefined) { try{ str.args = eval(node.getAttribute('data-l10n-args')) }catch(e) { - consoleWarn('Couldn\'t parse args for '+str.id) + console.warn('Couldn\'t parse args for '+str.id) } } @@ -887,7 +875,7 @@ window.html10n = (function(window, document, undefined) { } } if (!found) { - consoleWarn('Unexpected error: could not translate element content for key '+str.id, node) + console.warn('Unexpected error: could not translate element content for key '+str.id, node) } } } From c14e1696b312610fdcfecf7f5cba0de957e4f45a Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 18:09:29 +0000 Subject: [PATCH 49/66] remove stuff, new files --- src/static/css/pad.css | 5 +- src/static/font/fontawesome-etherpad.eot | Bin 10200 -> 15442 bytes src/static/font/fontawesome-etherpad.svg | 93 ++++++++++++------ src/static/font/fontawesome-etherpad.ttf | Bin 9984 -> 15224 bytes src/static/font/fontawesome-etherpad.woff | Bin 6188 -> 10076 bytes src/static/img/backgrad.gif | Bin 697 -> 0 bytes src/static/img/connectingbar.gif | Bin 10932 -> 0 bytes src/static/img/crushed_button_depressed.png | Bin 4134 -> 0 bytes src/static/img/crushed_button_undepressed.png | Bin 4166 -> 0 bytes src/static/img/crushed_current_location.png | Bin 1009 -> 0 bytes src/static/img/etherpad_lite_icons.png | Bin 8318 -> 0 bytes src/static/img/fileicons.gif | Bin 1649 -> 0 bytes src/static/img/gritter.png | Bin 4880 -> 0 bytes src/static/img/leftarrow.png | Bin 494 -> 0 bytes src/static/img/loading.gif | Bin 658 -> 0 bytes src/static/img/pause.png | Bin 2883 -> 0 bytes src/static/img/play.png | Bin 3017 -> 0 bytes src/static/img/roundcorner_left.gif | Bin 123 -> 0 bytes src/static/img/roundcorner_right.gif | Bin 131 -> 0 bytes src/static/img/star.png | Bin 3241 -> 0 bytes src/static/img/stepper_buttons.png | Bin 4858 -> 0 bytes src/static/img/timeslider_background.png | Bin 182 -> 0 bytes src/static/img/timeslider_left.png | Bin 686 -> 0 bytes src/static/img/timeslider_right.png | Bin 517 -> 0 bytes src/static/js/pad_impexp.js | 26 +---- src/templates/pad.html | 1 - 26 files changed, 68 insertions(+), 57 deletions(-) delete mode 100644 src/static/img/backgrad.gif delete mode 100644 src/static/img/connectingbar.gif delete mode 100644 src/static/img/crushed_button_depressed.png delete mode 100644 src/static/img/crushed_button_undepressed.png delete mode 100644 src/static/img/crushed_current_location.png delete mode 100644 src/static/img/etherpad_lite_icons.png delete mode 100644 src/static/img/fileicons.gif delete mode 100644 src/static/img/gritter.png delete mode 100644 src/static/img/leftarrow.png delete mode 100644 src/static/img/loading.gif delete mode 100644 src/static/img/pause.png delete mode 100644 src/static/img/play.png delete mode 100644 src/static/img/roundcorner_left.gif delete mode 100644 src/static/img/roundcorner_right.gif delete mode 100644 src/static/img/star.png delete mode 100644 src/static/img/stepper_buttons.png delete mode 100644 src/static/img/timeslider_background.png delete mode 100644 src/static/img/timeslider_left.png delete mode 100644 src/static/img/timeslider_right.png diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 91c97c5e..55a24733 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -637,12 +637,15 @@ table#otheruserstable { /* hidden element */ #importstatusball, -#importarrow, #importmessagesuccess, #importmessageabiword { display: none; } +.throbbold{ + font-weight:bold; +} + #importmessageabiword { color: #900; font-size: small; diff --git a/src/static/font/fontawesome-etherpad.eot b/src/static/font/fontawesome-etherpad.eot index 9a24fc67b57e3a10914eaf44d36b752b6985af05..cc934ce676862037a6df6a17bf934512bb965083 100644 GIT binary patch literal 15442 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 R&9BjGAJ>IXAv -Copyright (C) 2014 by original authors @ fontello.com +Generated by Fontastic.me - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/static/font/fontawesome-etherpad.ttf b/src/static/font/fontawesome-etherpad.ttf index a179bd191b4083b045254772eb892f768a3779bd..bbfd72170107b1eeb77dbef5373126cd071f6734 100644 GIT binary patch literal 15224 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 literal 9984 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 aIa@bOP`AbY|KEcWh_UFl?<5|8@P7btTjlux literal 6188 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

g!zN~?zf@OJ<|ib$2bX&K&R1jv2?Wo4 zQO?Gh!bz1KPt4br->FYaDCqKw7tV0C_l7HIO`2qoVw`;23$jIoS7&$*Q)nJBdp|fa zL|Q3%syk?Y<8Sw@BADI&JM#zu^kUWF|9dwcNg6&;0z`^Sj8Kms_YpE^aU_FSH6XY} z3g^yR+>mLx*g0QUmzm*lM*bgJl`@?Vv9T|sC}`Z96yl@_ItHcbFJK&?UG#>aK`9w; z5#NI}|L3AhWE|3p&uFY`gO0-FmOdbiu{ za=9E1hsWaqLC|0@Xti1dL2Nc#AQ15T{SXAn)K7z%}yN+s|gIJOb{ubQ##?I&RO z7OtrxHzTP9?0+ENUqe<8J;bwavdzPfq2$U*C#SODR1Z=Xz6;-%po^mCg=}khz3n9u zj&4;|*N|$T0`;$6H#9aiziDZ0t510QuCuHA{fEv&ePjytBaPnwX<)E#2ZK4x8ewy| zUwC{*oKPellSs$KNmJ8bWi#Kt&w_Hr)GkmI{K;}Ig z$feJ=9L;W+0jd4+jx++J=t(;X>N-=Z=*{B|z&%;T$IWuyAY!E8NUMAte@H{m?MN?H z@IMo1@icrNUcfLg346=z3IWr^zAbA=&c9w>$1Bq@ilI@KRak+MAK`=}c1dLt<8 diff --git a/src/static/img/connectingbar.gif b/src/static/img/connectingbar.gif deleted file mode 100644 index 5e54d6946960f0389f56639ebbc5bd41ab23caaa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10932 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 diff --git a/src/static/img/crushed_button_undepressed.png b/src/static/img/crushed_button_undepressed.png deleted file mode 100644 index d86e3f39743bc7b5334c58442a000bd39f772b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4166 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 QNB{r;07*qoM6N<$f)X$A_5c6? diff --git a/src/static/img/crushed_current_location.png b/src/static/img/crushed_current_location.png deleted file mode 100644 index 76e08359e3cdef6b81bf1799de7d9d1333ced9e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1009 zcmV4Tx07%D;lubw!VHn5%vyBL$L1eZG#n8bdR3?p50&~}|Y-L^6T}=^UoqczA za-5xJcGnb%5TaXI$LL~7bg+mH;h~^Y9U=tH>L5XMvIruGP=a!lflfp+G*2MVV=={I+u3*z&b%+znSNh? z@6wl(2Or&d>ig(^5$5psQ?64%fTIpj5x4n-$s;zOHF-RxrHF@3mJ*RDu|{00hk|Xy zcZv7J9X#UTC^ICWq?I@+X*%h+Du|mhQry&>Cl=MHtP-!9_NXC^Q4G!N`f2XMZZqWr zS`Gob-V|*^1~C5sI8a@*)wqHE1HeLK(Y7A6_QO>!8nMO(%fyv=si#lb?0Pj&dK=ih zmCgRTm(6b8ryA79OGQfSncR*z?k!;VYd@2IFi$(NJ(G2sfLYq(z;3{I4Y>0eIQkga z_Y4S>1EFTPt|EV>*k!9uTT+|Q<#-|`G>GCU!9%Z>3EiqxUn@iuMX+3kpfiK%85XU_ zn39%q_4d+L#?){h-Dy786=rngn46A9+G&@lC;l2`?H%TOBz_o^JG;#V(zP1XJHs|} z$K+IZ$Yxi+s`z_y>{dtoy*W)@OL>ENeIwJ?k+)xroC^?F5eG+;J~O70a$6@8p#hsY zWirv`&+$7w9W?76p_n;MvHtVao9h(@p@2b#O1~-u1knXA>YzbK5;5|~6d{w9Sur}X zfzdxkDhN1OApaWWtXVmikfv-is~=uJrfUldg7`uFF0P2P;+*(xrYc=i^i1m)WNGo{ z57IR&=XG=5Tu-*XM0GvnRS+lZSYal^(W#@mm^xEcR5EL@>;4VLl+0174kMP*s8uOr z`3(B?II8WmJ&Juj_1s;owZbn9FPFWZ+On(Uwy9WQs;$q(IA=cN5A(6$#NkC3M6+2gxWKJ~}`KYMUz8EMX|Kk@(Bqq`;~X>zMQMY^9n>Q4V> f7zLwX6p#V{MAqJ+{L9Q100000NkvXXu0mjf5AW6a diff --git a/src/static/img/etherpad_lite_icons.png b/src/static/img/etherpad_lite_icons.png deleted file mode 100644 index 27867d428d6dcdb62a1271f691094f59333c02bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8318 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 diff --git a/src/static/img/fileicons.gif b/src/static/img/fileicons.gif deleted file mode 100644 index c03b6031a62780479212fe50240ccb60dd3750b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1649 zcmV-%29EhhNk%w1VG#hQ0LFg+N=i!c@$svxtN8f%?Ck87m6fH(lWA#bk>88L!^5H0 zkZhRMh{M*(%FAi5&)DhJ@UW|TdV1ENII*#@+}zw~iqb`iz>v zf~|G_{{L2K$m;6q^z-xg+Sq8atmy3bRMTo|S1^Qxgj#dVR;1GS>F8CtoVe@D)85Wm zebCj_)SjN7e3;j!+1Po*$&9wKinoi9rQ7nuzvO&%eWq>QR88e;V~mZB=jZ3( zdUlW1tH+_Iwc_h`Z02WOZJt~9_xfah(8$`t?eF;7-}3tU`uqI;&e72{G&SI;IqlGZ z`1A9#zpu-QhV7!9-oAgUgfr;PKU`c~`}_WqawOU~EzCkajOU@7!GiFCb+Eza-*Ii` zUQ=L%(ERu8XOqyCkY>5DU+(Pa!j(Fhl8RTV-r>@!$j8Tg#dN>dy29eFdU0Rt+`#nC z%lG;GPL;ljjgelWhk&eXK{ywRxouLVWc&O3Zf41egav$kkdcrRhI|8iewmsB2b6?;dmtO50RbO=Je`6I z3uLThWEB-+ryC%u3v)}mydy>gntpwM3rjF$H9s&lEiC~AA3VauORQgFH83qF8>PU* zWX2UgEk8yzCj+(t(-lkPMn)$_NheC`8|_#XEkWc#NIdKrKyaFv4n}?yF*hQhl6wQD z8EJ^5V#OpL9zL9Q;)Dl}9zurPLlV<4L4AU$)O7NXrIo=3@EPPtlFdGR3NYHqv!~CW zK!f(Id9#lvLY6S8a!+>;I0au2I3<&N3@ivWv0xl~Y$RNSE3x{>nh$zS)1BHwXD)bm2 zg0HZG3l7wvut3L-V}cR$`e-8pg__bnhyZ~&?E!}_pdEsgf%-)g+#e|g10Z4jtpp%_0~V;#J)<<32?!eO@WKuh5MZH&gT(hj0X$HU zKmi3%AYuV8pyY=J5inr_00$Hh!2tl6kU#_~?qC8F8vvjI6A1_azy=AJprQbLxc&&h zl1$n-lS>0o5aR>_I1)ht0!&cA0fN*t!4(Ja!N&_o@^Qcw6ojYdnryD=h?sD~SwIJc zoVQd?bPmFY5);%|ihFqKNk9{XHc(0}8}M-y9|V+PMhOjcbBZQUx^#vWRzRxGGXhr1 zM*?ZM@InL-66Wa(9dtlJ6DE|(&XY=9;XY0?k_FFvJZIq}JgL zJwPyp4I%WP!wnY?D22|Mkn~UrP-Hud4Lxijhk?p12SyH3(5set^HOK;9{?A%oxg0i z-EZ2Gln13!F%|3-dkRklU%jZ&SBrfd50HQc6HqBYFbV#*smKZX!N%Z(8~zQ)DlN!P z<4iR0IOH1S(|F~mjqHL8nQP7l8$zq7iPYGRY$64t$G)8EVoO&xOlQMw)7ozL?)!JJ zColmJFT4N*5Nikk2O4P(AOH|?M4!U+)Mt?c8fc)s#`ZuIF2D@Z2_#_s6gj~0#|tR{ zA$*qKi+_Fj1N v0ZdU3Bme>lvQU7+4Wfq=KpzEOu){IBpb!E`00punN5K){iN9k+AOHY6T+#W% diff --git a/src/static/img/gritter.png b/src/static/img/gritter.png deleted file mode 100644 index 0ca3bc0a0f8068194082db9719d6e20a8645985f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4880 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 Zf3P5-;PGuo@D~?gbJgKWjfL<1{{eTAuA%?{ diff --git a/src/static/img/leftarrow.png b/src/static/img/leftarrow.png deleted file mode 100644 index 1bec1288271826468e736f7b62acda6d0f622efa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494 zcmVEF;N?0BC*%=0f<)+3lojLfpj;s=GHkBLvw|~A)CxE z*}J{lkIVn&YlUDKhG7_nVHk#CMnZsyhqHm)5VZ$u)} zrfzH!7MU6MhV_$16cyGGFlVf5U7TO05U~je^WcI&1VL`qZ}i>)*R_70VK9c&+`$~- zucP(-@u!#P`-xhl-M)z`rN{~pYz3_obhX3!(IW}Dy|aA*7P*lnClm`~71HTE%#j=9 z0DS=;|0>|mLb~0@15~OYqzpHAhn{|=OiyD${IwA6d07hF0(IYw77~vy^peR$ad~NR zRtxQCsaG>yYlw7e<;?TEgeD8=f40!bbtIEn>(Q;)YF#zSLN)4V1E%^y9b*oSjr!?& zzq->wak#P@cWB()%D44b6?cq@ksx+C>kvQ>N_Ox9`D&2L%NMD^{$ycJ12Rw{QRd|IdI8DE{a6 za}5c0b_{Se(lcOY1gcT|$-*hZz`>vcQV%kgfyGqdr043r7O&6l{=a~|=W;^ZwS|6e z-C?f|?s_kB-Ys{1(CpV8(f!MWm1-Q0a0FPX&cCptM2HcaNhS!BA{Ck>61-fz;@rDe zWnY!k7d)*u>DG6X>$dTE;#2+zEOHP`WYU>`A;W|Tn?XoUnyKLD$QkEqCHN+D>Cs!e zM0A8p)_Up8^ESKpM%?8~ozTRF6ela7lR_X)Vny?uGr~!C6#SelSv5K&-h}KCR$RU2 z;h{-B7uJ3e+bFrBjQLrM{38DL3mIeskIJRFR0<^mRA9QZj|vA!wWGg;B!)mCr^xA!K;+d?vqBEj1zxyuWxJC~S2ZTKeY+!q& zV??VrQJU=09J Cwd;@o diff --git a/src/static/img/pause.png b/src/static/img/pause.png deleted file mode 100644 index 657782c0fac9f6e6058803bd276a36b73b83d1de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2883 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 U&g~@{0(_l^4=OOYFfdpH0MXt-F#rGn diff --git a/src/static/img/roundcorner_right.gif b/src/static/img/roundcorner_right.gif deleted file mode 100644 index 97acfbf2e6b0d7a6876999603877bbdb61736e7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131 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 diff --git a/src/static/img/timeslider_background.png b/src/static/img/timeslider_background.png deleted file mode 100644 index 851af4e8000a0de07f0bb2248eb73c0c817f0b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^Oh9bU!OXzG*wuaWGms-$;u=vBoS#-wo>-L1;Fyx1 zl&avFo0y&&l$w}QS$Hzl2B?TXz$e7@-@kwV|Nl=*OFMJs%=ho#xni=90i|p`T^vIy zZY3q8B{VuKNGmi;efqJv}@+I#ZO?)Y#I} dG@OLk8TK(UUcVv{dJ$+4gQu&X%Q~loCIDe5JEZ^s diff --git a/src/static/img/timeslider_left.png b/src/static/img/timeslider_left.png deleted file mode 100644 index 48a9b0e1797c61874ac301fc2c518c3bc575b693..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmeAS@N?(olHy`uVBq!ia0vp^Z9r_#!OXzGn3`J90pv)QxJHx&=ckpFCl;kLIHu$$ zr7C#lCZ?wbr6#6S7M@JC0V=8v@CkAK_wV22$&=I4(&FRemn~cN_3PJp^X7f{@L|P@ z6+eIeym8~k^5x6duV4TB_wQS`Zmn9iYQu&NFJ8P@vSi8m^XIQ$zkcrAxuZvqo;Y#h z-Me=`e*F0L>(|AL7oRva#N!CE=vZ+BMQ9>-DJ-emF6f(JQGlD$`rR^;80*oEOlad!TIIG!Gig# ztoRdET_Tov$*Qt2Fk3rrXJ8QkQqCN+7p~K5(f6@%(Bfc~E)5YVdwC(y(IQTx-?Gw4 zi-D=5F?Le$Tqg&YX$t3fm~IC1)+;T!!(*y7>!6myKEYKXJi%83jaTHer84BOF}FI* z;CkuY96QBn{R$=)fo8V(T1V3~PIv{q5!cjeX}6ksCgHJy^=s}<=d%wMEZ|6LoVCy_ zi|y)}2SA3`K0&56AwJ2A(|TqZ2Ax^3rB2c(Eg#0phTQN0!Mlk<>LSn-SP!miR^E*q3WToHk{**(JN!lZD$1S`>R? z+D@&l+1SnKEAjpQt^ILddQ%T}EZ%H9XCrf>@wTJIrPkfRNM-PJ^>bP0l+XkKhssVM diff --git a/src/static/img/timeslider_right.png b/src/static/img/timeslider_right.png deleted file mode 100644 index 1a1b2685b24a2e620a33d95f45ff6fe6867d20c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 517 zcmeAS@N?(olHy`uVBq!ia0vp^vw_&2gPDPWal2{N1t3SV#5JNMI6tkVJh3R1!7(L2 zDOJHUH!(dmC^a#qvhZZ84N#F^fKQ0)@87@w{{8#o$B&;sf2O6SefaR z@80?I=dWMC{`KqEix)4xeEIU%uV0@(e}4Dw-K|@<&Ye5=@87>ur%v6zef$6a|7Xse z`TqSokg;8a>pak8sgfYSU?3MeU=UGaxCL~px~Gd{NX4xrf#WP|c!VMtd|8fmhH?rx z@I>4>>98b?O(|C`il@7hfwAT4#b&R$7Nu7^yMwRR0{OaihK&6x6Q30dt@Nu2k)3;` zbMn%@nSSq***O%FE^8V#%zLsC?!d<{lIHwaQP_OgqVUgD0pZSLhDJs~$2Ddx zu`bkNit}t>ShTFLX;R1+ZQ;cnq0W8%yFMCZ-CB{kcv_bUT3g62(&S+u-Lk3y2GiT|Lvn#Y}u76H&*X|u)%QKOlHHA zIfYueyDw~7sCejBh|xM<#$4?UzL|@A&2IfmEVeECIaxfKZJl)PmWyuDYtP0yZoOOo us$!eM0<(?x&oJdLY0Rl}-1@UpUwsi{&#~=IeanCW%i!ti=d#Wzp$PzhYXgh` diff --git a/src/static/js/pad_impexp.js b/src/static/js/pad_impexp.js index aa48ad77..1454bb31 100644 --- a/src/static/js/pad_impexp.js +++ b/src/static/js/pad_impexp.js @@ -35,32 +35,10 @@ var padimpexp = (function() function fileInputUpdated() { + $('#importsubmitinput').addClass('throbbold'); $('#importformfilediv').addClass('importformenabled'); $('#importsubmitinput').removeAttr('disabled'); - $('#importmessagefail').fadeOut("fast"); - $('#importarrow').show(); - $('#importarrow').animate( - { - paddingLeft: "0px" - }, 500).animate( - { - paddingLeft: "10px" - }, 150, 'swing').animate( - { - paddingLeft: "0px" - }, 150, 'swing').animate( - { - paddingLeft: "10px" - }, 150, 'swing').animate( - { - paddingLeft: "0px" - }, 150, 'swing').animate( - { - paddingLeft: "10px" - }, 150, 'swing').animate( - { - paddingLeft: "0px" - }, 150, 'swing'); + $('#importmessagefail').fadeOut('fast'); } function fileInputSubmit() diff --git a/src/templates/pad.html b/src/templates/pad.html index 15fd45e2..83d09f88 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -192,7 +192,6 @@ - From 21ce9b4dd38ef7cbe76ad2a3c3cb2ea2909d8148 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 18:44:45 +0000 Subject: [PATCH 50/66] correct font stuff --- src/static/css/fontawesome-etherpad.css | 276 ++++++++++++++++------ src/static/css/pad.css | 120 +++++----- src/static/font/fontawesome-etherpad.eot | Bin 15442 -> 18372 bytes src/static/font/fontawesome-etherpad.svg | 125 +++++----- src/static/font/fontawesome-etherpad.ttf | Bin 15224 -> 18156 bytes src/static/font/fontawesome-etherpad.woff | Bin 10076 -> 10724 bytes 6 files changed, 331 insertions(+), 190 deletions(-) diff --git a/src/static/css/fontawesome-etherpad.css b/src/static/css/fontawesome-etherpad.css index 13f28f2b..f129e86d 100644 --- a/src/static/css/fontawesome-etherpad.css +++ b/src/static/css/fontawesome-etherpad.css @@ -1,76 +1,208 @@ +@charset "UTF-8"; + @font-face { - font-family: 'fontawesome-etherpad'; - src: url('../font/fontawesome-etherpad.eot?81419457'); - src: url('../font/fontawesome-etherpad.eot?81419457#iefix') format('embedded-opentype'), - url('../font/fontawesome-etherpad.woff?81419457') format('woff'), - url('../font/fontawesome-etherpad.ttf?81419457') format('truetype'), - url('../font/fontawesome-etherpad.svg?81419457#fontawesome-etherpad') format('svg'); - font-weight: normal; - font-style: normal; -} -/* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ -/* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ -/* -@media screen and (-webkit-min-device-pixel-ratio:0) { - @font-face { - font-family: 'fontawesome-etherpad'; - src: url('../font/fontawesome-etherpad.svg?81419457#fontawesome-etherpad') format('svg'); - } -} -*/ - - [class^="icon-"]:before, [class*=" icon-"]:before { font-family: "fontawesome-etherpad"; - font-style: normal; + src:url("../font/fontawesome-etherpad.eot"); + src:url("../font/fontawesome-etherpad.eot?#iefix") format("embedded-opentype"), + url("../font/fontawesome-etherpad.woff") format("woff"), + url("../font/fontawesome-etherpad.ttf") format("truetype"), + url("../font/fontawesome-etherpad.svg#fontawesome-etherpad") format("svg"); font-weight: normal; - speak: none; - - display: inline-block; - text-decoration: inherit; - width: 1em; - margin-right: .2em; - text-align: center; - /* opacity: .8; */ - - /* For safety - reset parent styles, that can break glyph codes*/ - font-variant: normal; - text-transform: none; - - /* fix buttons height, for twitter bootstrap */ - line-height: 1em; - - /* Animation center compensation - margins should be symmetric */ - /* remove if not needed */ - margin-left: .2em; - - /* you can be more comfortable with increased icons size */ - /* font-size: 120%; */ - - /* Uncomment for 3D effect */ - /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ + font-style: normal; + +} + +[data-icon]:before { + font-family: "fontawesome-etherpad" !important; + content: attr(data-icon); + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +[class^="icon-"]:before, +[class*=" icon-"]:before { + font-family: "fontawesome-etherpad" !important; + font-style: normal !important; + font-weight: normal !important; + font-variant: normal !important; + text-transform: none !important; + speak: none; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-clock:before { + content: "a"; +} +.icon-mic-no:before { + content: "b"; +} +.icon-text-height:before { + content: "c"; +} +.icon-text-width:before { + content: "d"; +} +.icon-talk-chat:before { + content: "e"; +} +.icon-talk-chat-2:before { + content: "f"; +} +.icon-video-camera:before { + content: "g"; +} +.icon-user:before { + content: "h"; +} +.icon-bold:before { + content: "i"; +} +.icon-italic:before { + content: "j"; +} +.icon-trash-bin:before { + content: "k"; +} +.icon-strikethrough:before { + content: "l"; +} +.icon-tachometer:before { + content: "m"; +} +.icon-letter-mail:before { + content: "n"; +} +.icon-font:before { + content: "o"; +} +.icon-underline:before { + content: "p"; +} +.icon-list:before { + content: "q"; +} +.icon-list-number:before { + content: "r"; +} +.icon-indent:before { + content: "s"; +} +.icon-outdent:before { + content: "t"; +} +.icon-undo:before { + content: "u"; +} +.icon-spinner:before { + content: "v"; +} +.icon-repeat-redo:before { + content: "w"; +} +.icon-eye-slash-close:before { + content: "x"; +} +.icon-volume-up:before { + content: "y"; +} +.icon-paper-clip:before { + content: "z"; +} +.icon-exchange:before { + content: "C"; +} +.icon-cog-gear:before { + content: "D"; +} +.icon-code:before { + content: "E"; +} +.icon-play:before { + content: "F"; +} +.icon-backward:before { + content: "G"; +} +.icon-forward:before { + content: "H"; +} +.icon-step-forward:before { + content: "I"; +} +.icon-step-backward:before { + content: "J"; +} +.icon-align-justify:before { + content: "A"; +} +.icon-align-left:before { + content: "B"; +} +.icon-align-right:before { + content: "K"; +} +.icon-align-center:before { + content: "L"; +} +.icon-subscript:before { + content: "M"; +} +.icon-superscript:before { + content: "N"; +} +.icon-file:before { + content: "O"; +} +.icon-file-document:before { + content: "P"; +} +.icon-file-text:before { + content: "Q"; +} +.icon-files:before { + content: "R"; +} +.icon-filmstrip:before { + content: "S"; +} +.icon-folder2:before { + content: "T"; +} +.icon-list-bullet:before { + content: "U"; +} +.icon-pencil:before { + content: "V"; +} +.icon-pause:before { + content: "W"; +} +.icon-phone-mobile:before { + content: "X"; +} +.icon-mic:before { + content: "Y"; +} +.icon-camera:before { + content: "Z"; +} +.icon-chat-bubble:before { + content: "0"; +} +.icon-chat-bubble-two:before { + content: "1"; +} +.icon-ptint:before { + content: "2"; +} +.icon-group:before { + content: "3"; } - -.icon-users:before { content: '\e800'; } /* '' */ -.icon-star:before { content: '\e801'; } /* '' */ -.icon-cog:before { content: '\e802'; } /* '' */ -.icon-bold:before { content: '\e803'; } /* '' */ -.icon-italic:before { content: '\e804'; } /* '' */ -.icon-indent-left:before { content: '\e805'; } /* '' */ -.icon-indent-right:before { content: '\e806'; } /* '' */ -.icon-list-bullet:before { content: '\e807'; } /* '' */ -.icon-list-numbered:before { content: '\e808'; } /* '' */ -.icon-strike:before { content: '\e809'; } /* '' */ -.icon-underline:before { content: '\e80a'; } /* '' */ -.icon-cw:before { content: '\e80b'; } /* '' */ -.icon-ccw:before { content: '\e80c'; } /* '' */ -.icon-clock:before { content: '\e80d'; } /* '' */ -.icon-eye-off:before { content: '\e80e'; } /* '' */ -.icon-eye:before { content: '\e80f'; } /* '' */ -.icon-play:before { content: '\e810'; } /* '' */ -.icon-fast-bw:before { content: '\e811'; } /* '' */ -.icon-fast-fw:before { content: '\e812'; } /* '' */ -.icon-pause:before { content: '\e813'; } /* '' */ -.icon-glass:before { content: '\e814'; } /* '' */ -.icon-code:before { content: '\e815'; } /* '' */ -.icon-exchange:before { content: '\e816'; } /* '' */ -.icon-chat:before { content: '\e817'; } /* '' */ \ No newline at end of file diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 55a24733..f97e1b3e 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -611,28 +611,36 @@ table#otheruserstable { margin-top: 4px; background-repeat: no-repeat; padding-left: 25px; - background-image: url("../../static/img/etherpad_lite_icons.png"); color: #333; text-decoration: none; padding-bottom:2px; + display:inline; + padding-left:5px; + font-family: "Arial"; } -#exporthtml { - background-position: 0px -299px +.exportlink{ + font-family: "fontawesome-etherpad"; + display:block; + margin:5px; + color:#666; } -#exportplain { - background-position: 0px -395px +#exporthtmla:before { + content: "\e826"; } -#exportword { - background-position: 0px -275px +#exportplaina:before { + content: "\e802"; } -#exportpdf { - background-position: 0px -371px +#exportworda:before { + content: "\e804"; } -#exportopen { - background-position: 0px -347px +#exportpdfa:before { + content: "\e803"; } -#exportdokuwiki { - background-position: 0px -459px +#exportopena:before { + content: "\e805"; +} +#exportdokuwikia:before { + content: "\e805"; } /* hidden element */ @@ -692,58 +700,58 @@ table#otheruserstable { color: #666; } .buttonicon-bold:before { - content: "\e803"; + content: "\e81c"; } .buttonicon-italic:before { - content: "\e804"; + content: "\e81d"; } .buttonicon-underline:before { - content: "\e80a"; -} -.buttonicon-strikethrough:before { - content: "\e809"; -} -.buttonicon-insertorderedlist:before { - content: "\e808"; -} -.buttonicon-insertunorderedlist:before { - content: "\e807"; -} -.buttonicon-indent:before { - content: "\e806"; -} -.buttonicon-outdent:before { - content: "\e805"; -} -.buttonicon-undo:before { - content: "\e80c"; -} -.buttonicon-redo:before { - content: "\e80b"; -} -.buttonicon-clearauthorship:before { - content: "\e80e"; -} -.buttonicon-settings:before { - content: "\e802"; -} -.buttonicon-import_export:before { - content: "\e816"; -} -.buttonicon-embed:before { - content: "\e815"; -} -.buttonicon-history:before { - content: "\e80d"; -} -.buttonicon-chat:before { content: "\e817"; } +.buttonicon-strikethrough:before { + content: "\e818"; +} +.buttonicon-insertorderedlist:before { + content: "\e816"; +} +.buttonicon-insertunorderedlist:before { + content: "\e815"; +} +.buttonicon-indent:before { + content: "\e814"; +} +.buttonicon-outdent:before { + content: "\e813"; +} +.buttonicon-undo:before { + content: "\e823"; +} +.buttonicon-redo:before { + content: "\e824"; +} +.buttonicon-clearauthorship:before { + content: "\e80d"; +} +.buttonicon-settings:before { + content: "\e833"; +} +.buttonicon-import_export:before { + content: "\e834"; +} +.buttonicon-embed:before { + content: "\e827"; +} +.buttonicon-history:before { + content: "\e837"; +} +.buttonicon-chat:before { + content: "\e829"; +} .buttonicon-showusers:before { - content: "\e800"; + content: "\e808"; } .buttonicon-savedRevision:before { - content: "\e801"; + content: "\e835"; } #focusprotector { z-index: 100; diff --git a/src/static/font/fontawesome-etherpad.eot b/src/static/font/fontawesome-etherpad.eot index cc934ce676862037a6df6a17bf934512bb965083..fb65168629fd9d9a4bc0e32665b1055db61af150 100644 GIT binary patch literal 18372 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 -Generated by Fontastic.me +Copyright (C) 2014 by original authors @ fontello.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/static/font/fontawesome-etherpad.ttf b/src/static/font/fontawesome-etherpad.ttf index bbfd72170107b1eeb77dbef5373126cd071f6734..f2fe398ec9f8fe56f220792e119b7014e8f54bf9 100644 GIT binary patch literal 18156 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 literal 15224 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 diff --git a/src/static/font/fontawesome-etherpad.woff b/src/static/font/fontawesome-etherpad.woff index 491fc501679b119445df29104082e5ae99d4d6ff..98de9c3e6673f1f0ce120fe83b1ed67a86d502d7 100644 GIT binary patch literal 10724 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 literal 10076 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 aIa@bOP`AbY|KEcWh_UFl?<5|8@P7btTjlux From 3ad9a58895090a6fad0ce5930cefdcfd89b64312 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 18:47:12 +0000 Subject: [PATCH 51/66] fontello config file --- src/static/font/config.json | 346 ++++++++++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 src/static/font/config.json diff --git a/src/static/font/config.json b/src/static/font/config.json new file mode 100644 index 00000000..34231cca --- /dev/null +++ b/src/static/font/config.json @@ -0,0 +1,346 @@ +{ + "name": "fontawesome-etherpad", + "css_prefix_text": "icon-", + "css_use_suffix": false, + "hinting": true, + "units_per_em": 1000, + "ascent": 850, + "glyphs": [ + { + "uid": "bf882b30900da12fca090d9796bc3030", + "css": "mail", + "code": 59402, + "src": "fontawesome" + }, + { + "uid": "474656633f79ea2f1dad59ff63f6bf07", + "css": "star", + "code": 59446, + "src": "fontawesome" + }, + { + "uid": "d17030afaecc1e1c22349b99f3c4992a", + "css": "star-empty", + "code": 59445, + "src": "fontawesome" + }, + { + "uid": "8b80d36d4ef43889db10bc1f0dc9a862", + "css": "user", + "code": 59401, + "src": "fontawesome" + }, + { + "uid": "31972e4e9d080eaa796290349ae6c1fd", + "css": "users", + "code": 59400, + "src": "fontawesome" + }, + { + "uid": "0f99ab40ab0b4d64a74f2d0deeb03e42", + "css": "videocam", + "code": 59403, + "src": "fontawesome" + }, + { + "uid": "381da2c2f7fd51f8de877c044d7f439d", + "css": "picture", + "code": 59404, + "src": "fontawesome" + }, + { + "uid": "7fd683b2c518ceb9e5fa6757f2276faa", + "css": "eye-off", + "code": 59405, + "src": "fontawesome" + }, + { + "uid": "7034e4d22866af82bef811f52fb1ba46", + "css": "code", + "code": 59431, + "src": "fontawesome" + }, + { + "uid": "7277ded7695b2a307a5f9d50097bb64c", + "css": "print", + "code": 59393, + "src": "fontawesome" + }, + { + "uid": "dcedf50ab1ede3283d7a6c70e2fe32f3", + "css": "chat", + "code": 59432, + "src": "fontawesome" + }, + { + "uid": "9c1376672bb4f1ed616fdd78a23667e9", + "css": "comment-empty", + "code": 59433, + "src": "fontawesome" + }, + { + "uid": "f48ae54adfb27d8ada53d0fd9e34ee10", + "css": "trash-empty", + "code": 59434, + "src": "fontawesome" + }, + { + "uid": "1b5a5d7b7e3c71437f5a26befdd045ed", + "css": "doc", + "code": 59394, + "src": "fontawesome" + }, + { + "uid": "9daa1fdf0838118518a7e22715e83abc", + "css": "file-pdf", + "code": 59395, + "src": "fontawesome" + }, + { + "uid": "310ffd629da85142bc8669f010556f2d", + "css": "file-word", + "code": 59396, + "src": "fontawesome" + }, + { + "uid": "f761c3bbe16ba2d332914ecb28e7a042", + "css": "file-excel", + "code": 59397, + "src": "fontawesome" + }, + { + "uid": "edcd4022de8d8df266ef7c42d2658ca5", + "css": "file-powerpoint", + "code": 59398, + "src": "fontawesome" + }, + { + "uid": "3c961c1a8d874815856fc6637dc5a13c", + "css": "file-image", + "code": 59399, + "src": "fontawesome" + }, + { + "uid": "26613a2e6bc41593c54bead46f8c8ee3", + "css": "file-code", + "code": 59430, + "src": "fontawesome" + }, + { + "uid": "e99461abfef3923546da8d745372c995", + "css": "cog", + "code": 59443, + "src": "fontawesome" + }, + { + "uid": "19c50c52858a81de58f9db488aba77bc", + "css": "mic", + "code": 59435, + "src": "fontawesome" + }, + { + "uid": "598a5f2bcf3521d1615de8e1881ccd17", + "css": "clock", + "code": 59447, + "src": "fontawesome" + }, + { + "uid": "bc71f4c6e53394d5ba46b063040014f1", + "css": "cw", + "code": 59428, + "src": "fontawesome" + }, + { + "uid": "f9c3205df26e7778abac86183aefdc99", + "css": "ccw", + "code": 59427, + "src": "fontawesome" + }, + { + "uid": "a73c5deb486c8d66249811642e5d719a", + "css": "arrows-cw", + "code": 59429, + "src": "fontawesome" + }, + { + "uid": "6020aff067fc3c119cdd75daa5249220", + "css": "exchange", + "code": 59444, + "src": "fontawesome" + }, + { + "uid": "ce06b5805120d0c2f8d60cd3f1a4fdb5", + "css": "play", + "code": 59436, + "src": "fontawesome" + }, + { + "uid": "b624a1e512819d410ddbee84e6918b9d", + "css": "stop", + "code": 59437, + "src": "fontawesome" + }, + { + "uid": "0b28050bac9d3facf2f0226db643ece0", + "css": "pause", + "code": 59438, + "src": "fontawesome" + }, + { + "uid": "c47efa0e3e74f6ba4c2562c1258fff1f", + "css": "to-end", + "code": 59426, + "src": "fontawesome" + }, + { + "uid": "12052b30d23a1a70d6b32962d5464cae", + "css": "to-start", + "code": 59425, + "src": "fontawesome" + }, + { + "uid": "f9cbf7508cd04145ade2800169959eef", + "css": "font", + "code": 59419, + "src": "fontawesome" + }, + { + "uid": "02cca871bb69da75e8ee286b7055832c", + "css": "bold", + "code": 59420, + "src": "fontawesome" + }, + { + "uid": "a8cb1c217f02b073db3670c061cc54d2", + "css": "italic", + "code": 59421, + "src": "fontawesome" + }, + { + "uid": "0c708edd8fae2376b3370aa56d40cf9e", + "css": "header", + "code": 59422, + "src": "fontawesome" + }, + { + "uid": "c009d417f87d6a27bb5a1cefd30b6cbd", + "css": "text-height", + "code": 59423, + "src": "fontawesome" + }, + { + "uid": "13a971bcccd2dda26d4d4eccd8593f8a", + "css": "text-width", + "code": 59424, + "src": "fontawesome" + }, + { + "uid": "f4f0e849b805be1f6d76b65581cb3b8b", + "css": "align-left", + "code": 59392, + "src": "fontawesome" + }, + { + "uid": "ae6336c46d73af999fe7460c089abb4d", + "css": "align-center", + "code": 59407, + "src": "fontawesome" + }, + { + "uid": "e1e7306b47c3c5e6faecce9d32571381", + "css": "align-right", + "code": 59408, + "src": "fontawesome" + }, + { + "uid": "25a81737628d1e654a30ad412d7d6dd7", + "css": "align-justify", + "code": 59409, + "src": "fontawesome" + }, + { + "uid": "48b87105bd38c20315f1b705b8c7b38c", + "css": "list", + "code": 59410, + "src": "fontawesome" + }, + { + "uid": "594e9271c08ff732c04b3bf3117b9040", + "css": "indent-left", + "code": 59411, + "src": "fontawesome" + }, + { + "uid": "4d2dfc45d8176b1f26aed973fa84a91e", + "css": "indent-right", + "code": 59412, + "src": "fontawesome" + }, + { + "uid": "a2a74f5e7b7d9ba054897d8c795a326a", + "css": "list-bullet", + "code": 59413, + "src": "fontawesome" + }, + { + "uid": "f6766a8b042c2453a4e153af03294383", + "css": "list-numbered", + "code": 59414, + "src": "fontawesome" + }, + { + "uid": "61c242c9e2134d5864d7fdd57b3c9289", + "css": "strike", + "code": 59416, + "src": "fontawesome" + }, + { + "uid": "d4a4a38a40b728f46dad1de4ac950231", + "css": "underline", + "code": 59415, + "src": "fontawesome" + }, + { + "uid": "4e88371fb8857dacc1f66afe6314e426", + "css": "superscript", + "code": 59417, + "src": "fontawesome" + }, + { + "uid": "3d1c929dbc966992185ce749548c1b2c", + "css": "subscript", + "code": 59418, + "src": "fontawesome" + }, + { + "uid": "9396b2d8849e0213a0f11c5fd7fcc522", + "css": "tasks", + "code": 59442, + "src": "fontawesome" + }, + { + "uid": "0bda4bc779d4c32623dec2e43bd67ee8", + "css": "gauge", + "code": 59439, + "src": "fontawesome" + }, + { + "uid": "cda0cdcfd38f5f1d9255e722dad42012", + "css": "spinner", + "code": 59406, + "src": "fontawesome" + }, + { + "uid": "fa9a0b7e788c2d78e24cef1de6b70e80", + "css": "brush", + "code": 59440, + "src": "fontawesome" + }, + { + "uid": "be13b8c668eb18839d5d53107725f1de", + "css": "slideshare", + "code": 59441, + "src": "fontawesome" + } + ] +} \ No newline at end of file From 9b5ee93bce5c6853c234855398fa8b9ee81e06ef Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 19:13:51 +0000 Subject: [PATCH 52/66] spinning loading icons --- src/static/css/pad.css | 34 +++++++++++++++++++++++++++++++- src/templates/admin/plugins.html | 8 ++++---- src/templates/pad.html | 4 ++-- 3 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/static/css/pad.css b/src/static/css/pad.css index f97e1b3e..d30d3303 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -224,6 +224,39 @@ li[data-key=showusers] > a #online_count { padding:10px; } +.loadingAnimation{ + -webkit-animation: loadingAnimation 2s infinite linear; + animation: loadingAnimation 2s infinite linear; + font-family: "fontawesome-etherpad"; + font-size:24px; + z-index:150; +} + +.loadingAnimation:before{ + content: "\e80e"; +} + +@-webkit-keyframes loadingAnimation { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} +@keyframes loadingAnimation { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + transform: rotate(359deg); + } +} + #editorcontainerbox { position: absolute; bottom: 0; @@ -1107,5 +1140,4 @@ input[type=checkbox] { .gritter-light .gritter-title { text-shadow: none; } - /* End of gritter stuff */ diff --git a/src/templates/admin/plugins.html b/src/templates/admin/plugins.html index 75c47ad4..db90ee04 100644 --- a/src/templates/admin/plugins.html +++ b/src/templates/admin/plugins.html @@ -49,7 +49,7 @@

-

+

@@ -59,7 +59,7 @@

You haven't installed any plugins yet.

-


Fetching installed plugins...

+


Fetching installed plugins...

@@ -89,7 +89,7 @@
-

+

@@ -101,7 +101,7 @@

 

No plugins found.

-


Fetching...

+


Fetching...

diff --git a/src/templates/pad.html b/src/templates/pad.html index 83d09f88..f4107f2c 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -191,7 +191,7 @@
- +
@@ -308,7 +308,7 @@ █  
- loading.. +
From 9712f852e95db45937643fc62afbc3ab90020bd1 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 19:16:50 +0000 Subject: [PATCH 53/66] remove connecting bar image --- src/static/js/pad.js | 42 ------------------------------------------ src/templates/pad.html | 2 +- 2 files changed, 1 insertion(+), 43 deletions(-) diff --git a/src/static/js/pad.js b/src/static/js/pad.js index e1c19998..4f5b23c7 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -386,7 +386,6 @@ var pad = { diagnosticInfo: {}, initTime: 0, clientTimeOffset: null, - preloadedImages: false, padOptions: {}, // these don't require init; clientVars should all go through here @@ -728,19 +727,6 @@ var pad = { }, handleIsFullyConnected: function(isConnected, isInitialConnect) { - // load all images referenced from CSS, one at a time, - // starting one second after connection is first established. - if (isConnected && !pad.preloadedImages) - { - window.setTimeout(function() - { - if (!pad.preloadedImages) - { - pad.preloadImages(); - pad.preloadedImages = true; - } - }, 1000); - } pad.determineChatVisibility(isConnected && !isInitialConnect); pad.determineAuthorshipColorsVisibility(); @@ -837,34 +823,6 @@ var pad = { { pad.collabClient.addHistoricalAuthors(data); } - }, - preloadImages: function() - { - var images = ["../static/img/connectingbar.gif"]; - - function loadNextImage() - { - if (images.length == 0) - { - return; - } - var img = new Image(); - img.src = images.shift(); - if (img.complete) - { - scheduleLoadNextImage(); - } - else - { - $(img).bind('error load onreadystatechange', scheduleLoadNextImage); - } - } - - function scheduleLoadNextImage() - { - window.setTimeout(loadNextImage, 0); - } - scheduleLoadNextImage(); } }; diff --git a/src/templates/pad.html b/src/templates/pad.html index f4107f2c..aba3f64f 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -217,7 +217,7 @@

-

+

From 4a12eec3e00dd9b0ae35e9bf5044ae0c1a22643c Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 21:10:40 +0000 Subject: [PATCH 54/66] a font lookup file --- src/static/css/fontawesome-etherpad-codes.css | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 src/static/css/fontawesome-etherpad-codes.css diff --git a/src/static/css/fontawesome-etherpad-codes.css b/src/static/css/fontawesome-etherpad-codes.css new file mode 100644 index 00000000..3bbfe6e9 --- /dev/null +++ b/src/static/css/fontawesome-etherpad-codes.css @@ -0,0 +1,57 @@ + +.icon-align-left:before { content: '\e800'; } /* '' */ +.icon-print:before { content: '\e801'; } /* '' */ +.icon-doc:before { content: '\e802'; } /* '' */ +.icon-file-pdf:before { content: '\e803'; } /* '' */ +.icon-file-word:before { content: '\e804'; } /* '' */ +.icon-file-excel:before { content: '\e805'; } /* '' */ +.icon-file-powerpoint:before { content: '\e806'; } /* '' */ +.icon-file-image:before { content: '\e807'; } /* '' */ +.icon-users:before { content: '\e808'; } /* '' */ +.icon-user:before { content: '\e809'; } /* '' */ +.icon-mail:before { content: '\e80a'; } /* '' */ +.icon-videocam:before { content: '\e80b'; } /* '' */ +.icon-picture:before { content: '\e80c'; } /* '' */ +.icon-eye-off:before { content: '\e80d'; } /* '' */ +.icon-spinner:before { content: '\e80e'; } /* '' */ +.icon-align-center:before { content: '\e80f'; } /* '' */ +.icon-align-right:before { content: '\e810'; } /* '' */ +.icon-align-justify:before { content: '\e811'; } /* '' */ +.icon-list:before { content: '\e812'; } /* '' */ +.icon-indent-left:before { content: '\e813'; } /* '' */ +.icon-indent-right:before { content: '\e814'; } /* '' */ +.icon-list-bullet:before { content: '\e815'; } /* '' */ +.icon-list-numbered:before { content: '\e816'; } /* '' */ +.icon-underline:before { content: '\e817'; } /* '' */ +.icon-strike:before { content: '\e818'; } /* '' */ +.icon-superscript:before { content: '\e819'; } /* '' */ +.icon-subscript:before { content: '\e81a'; } /* '' */ +.icon-font:before { content: '\e81b'; } /* '' */ +.icon-bold:before { content: '\e81c'; } /* '' */ +.icon-italic:before { content: '\e81d'; } /* '' */ +.icon-header:before { content: '\e81e'; } /* '' */ +.icon-text-height:before { content: '\e81f'; } /* '' */ +.icon-text-width:before { content: '\e820'; } /* '' */ +.icon-to-start:before { content: '\e821'; } /* '' */ +.icon-to-end:before { content: '\e822'; } /* '' */ +.icon-ccw:before { content: '\e823'; } /* '' */ +.icon-cw:before { content: '\e824'; } /* '' */ +.icon-arrows-cw:before { content: '\e825'; } /* '' */ +.icon-file-code:before { content: '\e826'; } /* '' */ +.icon-code:before { content: '\e827'; } /* '' */ +.icon-chat:before { content: '\e828'; } /* '' */ +.icon-comment-empty:before { content: '\e829'; } /* '' */ +.icon-trash-empty:before { content: '\e82a'; } /* '' */ +.icon-mic:before { content: '\e82b'; } /* '' */ +.icon-play:before { content: '\e82c'; } /* '' */ +.icon-stop:before { content: '\e82d'; } /* '' */ +.icon-pause:before { content: '\e82e'; } /* '' */ +.icon-gauge:before { content: '\e82f'; } /* '' */ +.icon-brush:before { content: '\e830'; } /* '' */ +.icon-slideshare:before { content: '\e831'; } /* '' */ +.icon-tasks:before { content: '\e832'; } /* '' */ +.icon-cog:before { content: '\e833'; } /* '' */ +.icon-exchange:before { content: '\e834'; } /* '' */ +.icon-star-empty:before { content: '\e835'; } /* '' */ +.icon-star:before { content: '\e836'; } /* '' */ +.icon-clock:before { content: '\e837'; } /* '' */ \ No newline at end of file From 0bea3a3af6045a4ca4b6f853d24107904a26589e Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 21:13:21 +0000 Subject: [PATCH 55/66] no image on timeslider --- src/templates/timeslider.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index 19f8dde0..fceb894f 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -116,7 +116,7 @@

-

+

From 645ec830b0f5914b209020c75c729c51629d8c08 Mon Sep 17 00:00:00 2001 From: Beau Gunderson Date: Tue, 18 Nov 2014 13:52:42 -0800 Subject: [PATCH 56/66] Don't crash on bad plugins.json; fixes #2323 --- src/static/js/pluginfw/installer.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js index bf779d7a..90bd9aa2 100644 --- a/src/static/js/pluginfw/installer.js +++ b/src/static/js/pluginfw/installer.js @@ -66,7 +66,12 @@ exports.getAvailablePlugins = function(maxCacheAge, cb) { if(exports.availablePlugins && maxCacheAge && Math.round(+new Date/1000)-cacheTimestamp <= maxCacheAge) { return cb && cb(null, exports.availablePlugins) } - plugins = JSON.parse(plugins); + try { + plugins = JSON.parse(plugins); + } catch (err) { + console.error('error parsing plugins.json:', err); + plugins = []; + } exports.availablePlugins = plugins; cacheTimestamp = Math.round(+new Date/1000); cb && cb(null, plugins) From a06f01c04a3c2f989f1d4b2465b4ee0ffb037634 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 22:21:36 +0000 Subject: [PATCH 57/66] some timeslider styling but this wont be completed by me --- src/static/css/timeslider.css | 107 ++++++++++++++++++++-------------- 1 file changed, 62 insertions(+), 45 deletions(-) diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css index 6608df3e..a45a7937 100644 --- a/src/static/css/timeslider.css +++ b/src/static/css/timeslider.css @@ -14,14 +14,14 @@ top: 0; } #timeslider-left { - background-image: url(../../static/img/timeslider_left.png); + background-color:#fff; height: 63px; left: 0; position: absolute; width: 134px; } #timeslider-right { - background-image: url(../../static/img/timeslider_right.png); + background-color:#fff; height: 63px; position: absolute; right: 0; @@ -29,7 +29,6 @@ width: 155px; } #timeslider { - background-image: url(../../static/img/timeslider_background.png); height: 63px; margin: 0 9px; -webkit-touch-callout: none; @@ -50,7 +49,7 @@ -webkit-user-select: none; -moz-user-select: none; user-select: none; - background-image: url(../../static/img/crushed_current_location.png); + background-color: #666; cursor: pointer; height: 61px; left: 0; @@ -63,66 +62,95 @@ -moz-user-select: none; user-select: none; cursor: pointer; - height: 35px; + height: 60px; margin-left: 5px; margin-right: 150px; position: relative; - top: 20px; + top: 0px; } + #playpause_button, #playpause_button_icon { - height: 47px; + height: 44px; position: absolute; - width: 47px; + width: 44px; + text-align:center; + vertical-align:middle; } #playpause_button { - background-image: url(../../static/img/crushed_button_undepressed.png); right: 77px; top: 9px; + height:50px; + height:50px; + background: background-linear-gradient( #F7F7F7, #F1F1F1 80%) repeat scroll 0 0 transparent; + border-radius:24px; } +#playpause_button_icon:before { + line-height:44px; + padding-left:2px; + font-family: fontawesome-etherpad; + content: "\e810"; + font-size:24px; + color:#666; +} + #playpause_button_icon { - background-image: url(../../static/img/play.png); left: 0; top: 0; + border-radius:48px; + border: solid 1px #666; } -.pause#playpause_button_icon { - background-image: url(../../static/img/pause.png) +.pause:before { + line-height:48px; + padding-left:4px; + font-family: fontawesome-etherpad; + content: "\e811"; + font-size:24px; + color:#666; } #leftstar, #rightstar, #leftstep, #rightstep { - background: url(../../static/img/stepper_buttons.png) 0 0 no-repeat; - height: 21px; + background-color: white; overflow: hidden; position: absolute; } -#leftstar { - background-position: 0 -44px; - right: 34px; - top: 8px; - width: 30px; + +.stepper{ + font-family: fontawesome-etherpad; + border-radius:2px; + border: #666 solid 1px; + line-height:18px; + text-align:center; + height:22px; + color:#666; } -#rightstar { - background-position: -29px -44px; - right: 5px; - top: 8px; - width: 29px; + +stepper:active{ + color:#000; } + #leftstep { - background-position: 0 -22px; - right: 34px; + right: 36px; top: 20px; - width: 30px; + width: 25px; } +#leftstep:before{ + content: '\e811'; + vertical-align:middle; +} +#rightstep:before{ + content: "\e812"; + vertical-align:middle; +} + #rightstep { - background-position: -29px -22px; - right: 5px; + right: 10px; top: 20px; - width: 30px; + width: 25px; } #timeslider .star { - background-image: url(../../static/img/star.png); cursor: pointer; height: 16px; position: absolute; @@ -130,7 +158,9 @@ width: 15px; } #timeslider #timer { - color: #fff; + background: linear-gradient(#F7F7F7, #F1F1F1 80%) repeat scroll 0% 0% transparent; + padding:2px; + border-radius:2px; font-family: Arial, sans-serif; font-size: 11px; left: 7px; @@ -291,16 +321,3 @@ OL { .list-number6 { list-style-type: lower-roman } -/* IE 6/7 fixes */ -* HTML #ui-slider-handle { - background-image: url(../../static/img/current_location.gif) -} -* HTML #timeslider .star { - background-image: url(../../static/img/star.gif) -} -* HTML #playpause_button_icon { - background-image: url(../../static/img/play.gif) -} -* HTML .pause#playpause_button_icon { - background-image: url(../../static/img/pause.gif) -} From e2410e41b0569c6ed71632e64e02604e1d4794a2 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 22:24:16 +0000 Subject: [PATCH 58/66] more polish --- src/static/css/timeslider.css | 1 + src/static/js/broadcast_slider.js | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css index a45a7937..468d8f64 100644 --- a/src/static/css/timeslider.css +++ b/src/static/css/timeslider.css @@ -84,6 +84,7 @@ height:50px; background: background-linear-gradient( #F7F7F7, #F1F1F1 80%) repeat scroll 0 0 transparent; border-radius:24px; + cursor:hand; } #playpause_button_icon:before { line-height:44px; diff --git a/src/static/js/broadcast_slider.js b/src/static/js/broadcast_slider.js index 0b0147dd..822526a3 100644 --- a/src/static/js/broadcast_slider.js +++ b/src/static/js/broadcast_slider.js @@ -379,16 +379,16 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) { var self = this; - $(self).css('background-image', 'url(/static/img/crushed_button_depressed.png)'); + // $(self).css('background-image', 'url(/static/img/crushed_button_depressed.png)'); $(self).mouseup(function(evt2) { - $(self).css('background-image', 'url(/static/img/crushed_button_undepressed.png)'); + // $(self).css('background-image', 'url(/static/img/crushed_button_undepressed.png)'); $(self).unbind('mouseup'); BroadcastSlider.playpause(); }); $(document).mouseup(function(evt2) { - $(self).css('background-image', 'url(/static/img/crushed_button_undepressed.png)'); + // $(self).css('background-image', 'url(/static/img/crushed_button_undepressed.png)'); $(document).unbind('mouseup'); }); }); From 09b08e5a72e02e93b1e54eeb09624b5c13cf3af1 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 22:29:46 +0000 Subject: [PATCH 59/66] working pause --- src/static/css/timeslider.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css index 468d8f64..f5bbb8be 100644 --- a/src/static/css/timeslider.css +++ b/src/static/css/timeslider.css @@ -102,10 +102,10 @@ border: solid 1px #666; } .pause:before { - line-height:48px; - padding-left:4px; + line-height:44px; + padding-left:2px; font-family: fontawesome-etherpad; - content: "\e811"; + content: "\e813" !important; font-size:24px; color:#666; } From 95cb721914bc726b8f3fd660c5042ec07de3b2c3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 22:41:00 +0000 Subject: [PATCH 60/66] clean up --- src/static/css/fontawesome-etherpad-codes.css | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 src/static/css/fontawesome-etherpad-codes.css diff --git a/src/static/css/fontawesome-etherpad-codes.css b/src/static/css/fontawesome-etherpad-codes.css deleted file mode 100644 index 3bbfe6e9..00000000 --- a/src/static/css/fontawesome-etherpad-codes.css +++ /dev/null @@ -1,57 +0,0 @@ - -.icon-align-left:before { content: '\e800'; } /* '' */ -.icon-print:before { content: '\e801'; } /* '' */ -.icon-doc:before { content: '\e802'; } /* '' */ -.icon-file-pdf:before { content: '\e803'; } /* '' */ -.icon-file-word:before { content: '\e804'; } /* '' */ -.icon-file-excel:before { content: '\e805'; } /* '' */ -.icon-file-powerpoint:before { content: '\e806'; } /* '' */ -.icon-file-image:before { content: '\e807'; } /* '' */ -.icon-users:before { content: '\e808'; } /* '' */ -.icon-user:before { content: '\e809'; } /* '' */ -.icon-mail:before { content: '\e80a'; } /* '' */ -.icon-videocam:before { content: '\e80b'; } /* '' */ -.icon-picture:before { content: '\e80c'; } /* '' */ -.icon-eye-off:before { content: '\e80d'; } /* '' */ -.icon-spinner:before { content: '\e80e'; } /* '' */ -.icon-align-center:before { content: '\e80f'; } /* '' */ -.icon-align-right:before { content: '\e810'; } /* '' */ -.icon-align-justify:before { content: '\e811'; } /* '' */ -.icon-list:before { content: '\e812'; } /* '' */ -.icon-indent-left:before { content: '\e813'; } /* '' */ -.icon-indent-right:before { content: '\e814'; } /* '' */ -.icon-list-bullet:before { content: '\e815'; } /* '' */ -.icon-list-numbered:before { content: '\e816'; } /* '' */ -.icon-underline:before { content: '\e817'; } /* '' */ -.icon-strike:before { content: '\e818'; } /* '' */ -.icon-superscript:before { content: '\e819'; } /* '' */ -.icon-subscript:before { content: '\e81a'; } /* '' */ -.icon-font:before { content: '\e81b'; } /* '' */ -.icon-bold:before { content: '\e81c'; } /* '' */ -.icon-italic:before { content: '\e81d'; } /* '' */ -.icon-header:before { content: '\e81e'; } /* '' */ -.icon-text-height:before { content: '\e81f'; } /* '' */ -.icon-text-width:before { content: '\e820'; } /* '' */ -.icon-to-start:before { content: '\e821'; } /* '' */ -.icon-to-end:before { content: '\e822'; } /* '' */ -.icon-ccw:before { content: '\e823'; } /* '' */ -.icon-cw:before { content: '\e824'; } /* '' */ -.icon-arrows-cw:before { content: '\e825'; } /* '' */ -.icon-file-code:before { content: '\e826'; } /* '' */ -.icon-code:before { content: '\e827'; } /* '' */ -.icon-chat:before { content: '\e828'; } /* '' */ -.icon-comment-empty:before { content: '\e829'; } /* '' */ -.icon-trash-empty:before { content: '\e82a'; } /* '' */ -.icon-mic:before { content: '\e82b'; } /* '' */ -.icon-play:before { content: '\e82c'; } /* '' */ -.icon-stop:before { content: '\e82d'; } /* '' */ -.icon-pause:before { content: '\e82e'; } /* '' */ -.icon-gauge:before { content: '\e82f'; } /* '' */ -.icon-brush:before { content: '\e830'; } /* '' */ -.icon-slideshare:before { content: '\e831'; } /* '' */ -.icon-tasks:before { content: '\e832'; } /* '' */ -.icon-cog:before { content: '\e833'; } /* '' */ -.icon-exchange:before { content: '\e834'; } /* '' */ -.icon-star-empty:before { content: '\e835'; } /* '' */ -.icon-star:before { content: '\e836'; } /* '' */ -.icon-clock:before { content: '\e837'; } /* '' */ \ No newline at end of file From e821cb13fa0707932e9ddd2844bc7be969cf9efe Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 22:47:20 +0000 Subject: [PATCH 61/66] more polish --- src/static/css/timeslider.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css index f5bbb8be..09db6dc8 100644 --- a/src/static/css/timeslider.css +++ b/src/static/css/timeslider.css @@ -108,6 +108,7 @@ content: "\e813" !important; font-size:24px; color:#666; + padding-left:0 !important; } #leftstar, #rightstar, @@ -133,7 +134,7 @@ stepper:active{ } #leftstep { - right: 36px; + right: 38px; top: 20px; width: 25px; } @@ -147,7 +148,7 @@ stepper:active{ } #rightstep { - right: 10px; + right: 12px; top: 20px; width: 25px; } From f5dcc374bae933f87ee3232d90750d9f1675e9e8 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 23:15:56 +0000 Subject: [PATCH 62/66] slight ui fix --- src/static/js/pad_editbar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index d39bfecd..bdf2d556 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -181,7 +181,7 @@ var padeditbar = (function() }, redrawHeight: function(){ var editbarHeight = $('.menu_left').height() + 2 + "px"; - var containerTop = $('.menu_left').height() + 5 + "px"; + var containerTop = $('.menu_left').height() + 7 + "px"; $('#editbar').css("height", editbarHeight); $('#editorcontainer').css("top", containerTop); }, From 0f1fd0b2818393386c13801cc83ec0cb51a1fe98 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 18 Nov 2014 23:51:22 +0000 Subject: [PATCH 63/66] working blocks --- src/templates/pad.html | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/templates/pad.html b/src/templates/pad.html index 15fd45e2..ed1332a7 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -42,7 +42,11 @@ <% e.begin_block("styles"); %> + + <% e.begin_block("customStyles"); %> + <% e.end_block(); %> + <% e.end_block(); %> @@ -347,7 +351,9 @@ + <% e.begin_block("customScripts"); %> + <% e.end_block(); %>