diff --git a/README.md b/README.md deleted file mode 100644 index 7d3a73f52..000000000 --- a/README.md +++ /dev/null @@ -1,126 +0,0 @@ -# Making collaborative editing the standard on the web - -# About -Etherpad lite is a really-real time collaborative editor spawned from the Hell fire of Etherpad. -We're reusing the well tested Etherpad easysync library to make it really realtime. Etherpad Lite -is based on node.js ergo is much lighter and more stable than the original Etherpad. Our hope -is that this will encourage more users to use and install a realtime collaborative editor. A smaller, manageable and well -documented codebase makes it easier for developers to improve the code and contribute towards the project. - -**Etherpad vs Etherpad lite** - - - - - - - - - - - - - - - - -
 EtherpadEtherpad Lite
Size of the folder (without git history)30 MB1.5 MB
Languages used server sideJavascript (Rhino), Java, ScalaJavascript (node.js)
Lines of server side Javascript code~101k~9k
RAM Usage immediately after start257 MB (grows to ~1GB)16 MB (grows to ~30MB)
- - -Etherpad Lite is designed to be easily embeddable and provides a [HTTP API](https://github.com/ether/etherpad-lite/wiki/HTTP-API) -that allows your web application to manage pads, users and groups. It is recommended to use the client implementations available for this API, listed on [this wiki page](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries). -There is also a [jQuery plugin](https://github.com/johnyma22/etherpad-lite-jquery-plugin) that helps you to embed Pads into your website - -**Visit [beta.etherpad.org](http://beta.etherpad.org) to test it live** - -Also, check out the **[FAQ](https://github.com/ether/etherpad-lite/wiki/FAQ)**, really! - -# Installation - -## Windows - -### Prebuilt windows package -This package works out of the box on any windows machine, but it's not very useful for developing purposes... - -1. Download the windows package -2. Extract the folder - -Now, run `start.bat` and open in your browser. You like it? [Next steps](#next-steps). - -### Fancy install -You'll need [node.js](http://nodejs.org) and (optionally, though recommended) git. - -1. Grab the source, either - - download - - or `git clone https://github.com/ether/etherpad-lite.git` (for this you need git, obviously) -2. start `bin\installOnWindows.bat` - -Now, run `start.bat` and open in your browser. - -Update to the latest version with `git pull origin`, then run `bin\installOnWindows.bat`, again. - -[Next steps](#next-steps). - -## Linux -You'll need gzip, git, curl, libssl develop libraries, python and gcc. -*For Debian/Ubuntu*: `apt-get install gzip git-core curl python libssl-dev pkg-config build-essential` -*For Fedora/CentOS*: `yum install gzip git-core curl python openssl-devel && yum groupinstall "Development Tools"` - -Additionally, you'll need [node.js](http://nodejs.org). - -**As any user (we recommend creating a separate user called etherpad-lite):** - -1. Move to a folder where you want to install Etherpad Lite. Clone the git repository `git clone git://github.com/ether/etherpad-lite.git` -2. Change into the new directory containing the cloned source code `cd etherpad-lite` - -Now, run `bin/run.sh` and open in your browser. - -Update to the latest version with `git pull origin`. The next start with bin/run.sh will update the dependencies. - -You like it? [Next steps](#next-steps). - -# Next Steps - -## Tweak the settings -You can modify the settings in `settings.json`. (If you need to handle multiple settings files, you can pass the path to a settings file to `bin/run.sh` using the `-s|--settings` option. This allows you to run multiple Etherpad Lite instances from the same installation.) - -You should use a dedicated database such as "mysql", if you are planning on using etherpad-lite in a production environment, since the "dirtyDB" database driver is only for testing and/or development purposes. - -## 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. - -Documentation can be found in `docs/`. - -# Development - -## Things you should know -Read this [git guide](http://learn.github.com/p/intro.html) and watch this [video on getting started with Etherpad Lite Development](http://youtu.be/67-Q26YH97E). - -If you're new to node.js, start with Ryan Dahl's [Introduction to Node.js](http://youtu.be/jo_B4LTHi3I). - -You can debug Etherpad lite using `bin/debugRun.sh`. - -If you want to find out how Etherpad's `Easysync` works (the library that makes it really realtime), start with this [PDF](https://github.com/ether/etherpad-lite/raw/master/doc/easysync/easysync-full-description.pdf) (complex, but worth reading). - -## Getting started -You know all this and just want to know how you can help? - -Look at the [TODO list](https://github.com/ether/etherpad-lite/wiki/TODO) and our [Issue tracker](https://github.com/ether/etherpad-lite/issues). (Please consider using [jshint](http://www.jshint.com/about/), if you plan to contribute code.) - -Also, and most importantly, read our [**Developer Guidelines**](https://github.com/ether/etherpad-lite/wiki/Developer-Guidelines), really! - -# Get in touch -Join the [mailinglist](http://groups.google.com/group/etherpad-lite-dev) and make some noise on our freenode irc channel [#etherpad-lite-dev](http://webchat.freenode.net?channels=#etherpad-lite-dev)! - -# Modules created for this project - -* [ueberDB](https://github.com/ether/ueberDB) "transforms every database into a object key value store" - manages all database access -* [channels](https://github.com/ether/channels) "Event channels in node.js" - ensures that ueberDB operations are atomic and in series for each key -* [async-stacktrace](https://github.com/ether/async-stacktrace) "Improves node.js stacktraces and makes it easier to handle errors" - -# Donate! -* [Flattr] (http://flattr.com/thing/71378/Etherpad-Foundation) -* Paypal - Press the donate button on [etherpad.org](http://etherpad.org) - -# License -[Apache License v2](http://www.apache.org/licenses/LICENSE-2.0.html) diff --git a/src/locales/en.ini b/src/locales/en.ini index a110583ea..e542594da 100644 --- a/src/locales/en.ini +++ b/src/locales/en.ini @@ -74,4 +74,19 @@ timeslider.pageTitle = {{appTitle}} Timeslider timeslider.toolbar.returnbutton = Return to pad timeslider.toolbar.authors = Authors: timeslider.toolbar.authorsList = No Authors -timeslider.exportCurrent = Export current version as: \ No newline at end of file +timeslider.exportCurrent = Export current version as: +timeslider.version = Version {{version}} +timeslider.saved = Saved {{month}} {{day}}, {{year}} +timeslider.dateformat = {{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}} +timeslider.month.january = January +timeslider.month.february = February +timeslider.month.march = March +timeslider.month.april = April +timeslider.month.may = May +timeslider.month.june = June +timeslider.month.july = July +timeslider.month.august = August +timeslider.month.september = September +timeslider.month.october = October +timeslider.month.november = November +timeslider.month.december = December diff --git a/src/node/hooks/express/socketio.js b/src/node/hooks/express/socketio.js index 546ba2af6..c2b9ff6c7 100644 --- a/src/node/hooks/express/socketio.js +++ b/src/node/hooks/express/socketio.js @@ -36,13 +36,10 @@ exports.expressCreateServer = function (hook_name, args, cb) { }); }); - // the following has been successfully tested with the following browsers - // works also behind reverse proxy - // Firefox 14.0.1 - // IE8 with Native XMLHTTP support - // IE8 without Native XMLHTTP support - // Chrome 21.0.1180.79 - io.set('transports', ['jsonp-polling']); + // 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', ['xhr-polling', 'jsonp-polling', 'htmlfile']); var socketIOLogger = log4js.getLogger("socket.io"); io.set('logger', { diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 9caa2b0be..fb2a592cb 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -38,6 +38,8 @@ exports.title = "Etherpad Lite"; * The app favicon fully specified url, visible e.g. in the browser window */ exports.favicon = "favicon.ico"; +exports.faviconPad = "../" + exports.favicon; +exports.faviconTimeslider = "../../" + exports.favicon; /** * The IP ep-lite should listen to diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css index 1dd0ca913..d786d89ba 100644 --- a/src/static/css/timeslider.css +++ b/src/static/css/timeslider.css @@ -113,7 +113,7 @@ background-position: -29px -22px; right: 5px; top: 20px; - width: 29px; + width: 30px; } #timeslider .star { background-image: url(../../static/img/star.png); diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 661ea0119..f7c4cc5c8 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -333,14 +333,6 @@ function Ace2Inner(){ return colorutils.triple2css(color); } - function doAlert(str) - { - scheduler.setTimeout(function() - { - alert(str); - }, 0); - } - editorInfo.ace_getRep = function() { return rep; @@ -1624,7 +1616,7 @@ function Ace2Inner(){ if (linesWrapped > 0) { - doAlert("Editor warning: " + linesWrapped + " long line" + (linesWrapped == 1 ? " was" : "s were") + " hard-wrapped into " + ccData.numLinesAfter + " lines."); + // console.log("Editor warning: " + linesWrapped + " long line" + (linesWrapped == 1 ? " was" : "s were") + " hard-wrapped into " + ccData.numLinesAfter + " lines."); } if (ss[0] >= 0) selStart = [ss[0] + a + netNumLinesChangeSoFar, ss[1]]; @@ -3569,7 +3561,6 @@ function Ace2Inner(){ inCallStackIfNecessary("handleKeyEvent", function() { - if (type == "keypress" || (isTypeForSpecialKey && keyCode == 13 /*return*/ )) { // in IE, special keys don't send keypress, the keydown does the action @@ -3583,7 +3574,6 @@ function Ace2Inner(){ { outsideKeyDown(evt); } - if (!stopped) { var specialHandledInHook = hooks.callAll('aceKeyEvent', { @@ -3622,6 +3612,12 @@ function Ace2Inner(){ }, 0); specialHandled = true; } + if ((!specialHandled) && isTypeForSpecialKey && keyCode == 83) + { + evt.preventDefault(); + parent.parent.pad.collabClient.sendMessage({"type":"SAVE_REVISION"}); /* The parent.parent part of this is BAD and I feel bad.. It may break something */ + specialHandled = true; + } if ((!specialHandled) && isTypeForSpecialKey && keyCode == 9 && !(evt.metaKey || evt.ctrlKey)) { // tab diff --git a/src/static/js/broadcast.js b/src/static/js/broadcast.js index 86e63f93f..d67398fbc 100644 --- a/src/static/js/broadcast.js +++ b/src/static/js/broadcast.js @@ -304,7 +304,14 @@ function loadBroadcastJS(socket, sendSocketMsg, fireWhenAllScriptsAreLoaded, Bro var hours = zpad(date.getHours(), 2); var minutes = zpad(date.getMinutes(), 2); var seconds = zpad(date.getSeconds(), 2); - return ([month, '/', day, '/', year, ' ', hours, ':', minutes, ':', seconds].join("")); + return (document.webL10n.get("timeslider.dateformat", { + "day": day, + "month": month, + "year": year, + "hours": hours, + "minutes": minutes, + "seconds": seconds + })); } @@ -313,7 +320,24 @@ function loadBroadcastJS(socket, sendSocketMsg, fireWhenAllScriptsAreLoaded, Bro $('#timer').html(dateFormat()); - var revisionDate = ["Saved", ["Jan", "Feb", "March", "April", "May", "June", "July", "Aug", "Sept", "Oct", "Nov", "Dec"][date.getMonth()], date.getDate() + ",", date.getFullYear()].join(" ") + var revisionDate = document.webL10n.get("timeslider.saved", { + "day": date.getDate(), + "month": [ + document.webL10n.get("timeslider.month.january"), + document.webL10n.get("timeslider.month.february"), + document.webL10n.get("timeslider.month.march"), + document.webL10n.get("timeslider.month.april"), + document.webL10n.get("timeslider.month.may"), + document.webL10n.get("timeslider.month.june"), + document.webL10n.get("timeslider.month.july"), + document.webL10n.get("timeslider.month.august"), + document.webL10n.get("timeslider.month.september"), + document.webL10n.get("timeslider.month.october"), + document.webL10n.get("timeslider.month.november"), + document.webL10n.get("timeslider.month.december") + ][date.getMonth()], + "year": date.getFullYear() + }); $('#revision_date').html(revisionDate) } diff --git a/src/static/js/broadcast_slider.js b/src/static/js/broadcast_slider.js index fed9f2e79..a597c926d 100644 --- a/src/static/js/broadcast_slider.js +++ b/src/static/js/broadcast_slider.js @@ -112,7 +112,7 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) { $(this).attr('href', $(this).attr('thref').replace("%revision%", newpos)); }); - $("#revision_label").html("Version " + newpos); + $("#revision_label").html(document.webL10n.get("timeslider.version", { "version": newpos})); if (newpos == 0) { @@ -215,7 +215,7 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) } if (authors.length == 0) { - authorsList.append("No Authors"); + authorsList.append(document.webL10n.get("timeslider.toolbar.authorsList")); } fixPadHeight(); @@ -346,7 +346,7 @@ function loadBroadcastSliderJS(fireWhenAllScriptsAreLoaded) var newloc = self.currentLoc + (evt2.clientX - self.startLoc); if (newloc < 0) newloc = 0; if (newloc > ($("#ui-slider-bar").width() - 2)) newloc = ($("#ui-slider-bar").width() - 2); - $("#revision_label").html("Version " + Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))); + $("#revision_label").html(document.webL10n.get("timeslider.version", { "version": Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))})); $(self).css('left', newloc); if (getSliderPosition() != Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))) _callSliderCallbacks(Math.floor(newloc * sliderLength / ($("#ui-slider-bar").width() - 2))) }); diff --git a/src/templates/pad.html b/src/templates/pad.html index ed98a2e7f..78605657b 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -32,7 +32,7 @@ - +