From 086132de6671a6f3e51059bbd895b754d9dad6bb Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Feb 2013 23:23:44 +0000 Subject: [PATCH 001/152] dont die on bad html but only warn to api logger but dont tell client that it failed cause html was bad --- src/node/utils/ImportHtml.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/node/utils/ImportHtml.js b/src/node/utils/ImportHtml.js index 7c638fb8..6e8ab23a 100644 --- a/src/node/utils/ImportHtml.js +++ b/src/node/utils/ImportHtml.js @@ -29,7 +29,6 @@ function setPadHTML(pad, html, callback) // by several orders of magnitude. pad.setText(""); var padText = pad.text(); - // Parse the incoming HTML with jsdom var doc = jsdom(html.replace(/>\n+<')); apiLogger.debug('html:'); @@ -38,8 +37,15 @@ function setPadHTML(pad, html, callback) // Convert a dom tree into a list of lines and attribute liens // using the content collector object var cc = contentcollector.makeContentCollector(true, null, pad.pool); - cc.collectContent(doc.childNodes[0]); + try{ // we use a try here because if the HTML is bad it will blow up + cc.collectContent(doc.childNodes[0]); + }catch(e){ + apiLogger.warn("HTML was not properly formed", e); + return; // We don't process the HTML because it was bad.. + } + var result = cc.finish(); + apiLogger.debug('Lines:'); var i; for (i = 0; i < result.lines.length; i += 1) From e152c477c7c9fbc65e6d7da6131011852f60bf34 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Feb 2013 23:38:02 +0000 Subject: [PATCH 002/152] include the callback call, for sanity and stop the pad from being nuked so early in the function --- src/node/db/API.js | 2 +- src/node/utils/ImportHtml.js | 7 +++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 07141fec..5f818914 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -270,7 +270,7 @@ exports.setHTML = function(padID, html, callback) if(ERR(err, callback)) return; // add a new changeset with the new html to the pad - importHtml.setPadHTML(pad, cleanText(html)); + importHtml.setPadHTML(pad, cleanText(html), callback); //update the clients on the pad padMessageHandler.updatePadClients(pad, callback); diff --git a/src/node/utils/ImportHtml.js b/src/node/utils/ImportHtml.js index 6e8ab23a..686d1c61 100644 --- a/src/node/utils/ImportHtml.js +++ b/src/node/utils/ImportHtml.js @@ -25,10 +25,6 @@ function setPadHTML(pad, html, callback) { var apiLogger = log4js.getLogger("ImportHtml"); - // Clean the pad. This makes the rest of the code easier - // by several orders of magnitude. - pad.setText(""); - var padText = pad.text(); // Parse the incoming HTML with jsdom var doc = jsdom(html.replace(/>\n+<')); apiLogger.debug('html:'); @@ -44,6 +40,8 @@ function setPadHTML(pad, html, callback) return; // We don't process the HTML because it was bad.. } + // console.warn("LUL WUT THE FUCK U DOIN HERE?"); + var result = cc.finish(); apiLogger.debug('Lines:'); @@ -90,6 +88,7 @@ function setPadHTML(pad, html, callback) // the changeset is ready! var theChangeset = builder.toString(); apiLogger.debug('The changeset: ' + theChangeset); + pad.setText(""); pad.appendRevision(theChangeset); } From 9e1dfc9487669884a6be5fe606f8d8259de065f3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Feb 2013 23:44:09 +0000 Subject: [PATCH 003/152] docs for setHTML --- doc/api/http_api.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/doc/api/http_api.md b/doc/api/http_api.md index 0543ef71..575b2c98 100644 --- a/doc/api/http_api.md +++ b/doc/api/http_api.md @@ -283,6 +283,16 @@ sets the text of a pad * `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"text too long", data: null}` +#### setHTML(padID, html) + * API >= 1 + +sets the text of a pad based on HTML, HTML must be well formed. Malformed HTML will send a warning to the API log + +*Example returns:* + * `{code: 0, message:"ok", data: null}` + * `{code: 1, message:"padID does not exist", data: null}` + + #### getHTML(padID, [rev]) * API >= 1 From 198110eb4b9f84eac03eb1dd04e3918f20fdad76 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 12 Feb 2013 23:49:43 +0000 Subject: [PATCH 004/152] drunk comments --- src/node/utils/ImportHtml.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/node/utils/ImportHtml.js b/src/node/utils/ImportHtml.js index 686d1c61..9f2fd351 100644 --- a/src/node/utils/ImportHtml.js +++ b/src/node/utils/ImportHtml.js @@ -40,8 +40,6 @@ function setPadHTML(pad, html, callback) return; // We don't process the HTML because it was bad.. } - // console.warn("LUL WUT THE FUCK U DOIN HERE?"); - var result = cc.finish(); apiLogger.debug('Lines:'); From 7c03bc2610a2d8f0e752bc9796bb460d50166fe9 Mon Sep 17 00:00:00 2001 From: John McLear Date: Thu, 14 Feb 2013 01:13:23 +0000 Subject: [PATCH 005/152] when exporting HTML include html and body --- src/node/db/API.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/node/db/API.js b/src/node/db/API.js index 5f818914..7a9ce41f 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -243,6 +243,8 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, rev, function(err, html) { if(ERR(err, callback)) return; + html = "" +html; // adds HTML head + html += ""; data = {html: html}; callback(null, data); }); @@ -253,9 +255,9 @@ exports.getHTML = function(padID, rev, callback) exportHtml.getPadHTML(pad, undefined, function (err, html) { if(ERR(err, callback)) return; - + html = "" +html; // adds HTML head + html += ""; data = {html: html}; - callback(null, data); }); } From c57bc444cde7d634dd17e6d83c492f05f890ef10 Mon Sep 17 00:00:00 2001 From: cohitre Date: Sun, 3 Mar 2013 15:53:17 -0800 Subject: [PATCH 006/152] basic toolbar setup --- src/node/utils/toolbar.js | 122 ++++++++++++++++++++++++++++++++++++++ src/templates/pad.html | 86 +++++++-------------------- 2 files changed, 145 insertions(+), 63 deletions(-) create mode 100644 src/node/utils/toolbar.js diff --git a/src/node/utils/toolbar.js b/src/node/utils/toolbar.js new file mode 100644 index 00000000..1bfcda01 --- /dev/null +++ b/src/node/utils/toolbar.js @@ -0,0 +1,122 @@ +/** + * The Toolbar Module creates and renders the toolbars and buttons + */ + +var _ = require("underscore") + , defaultButtons + , Button + , ButtonsGroup + , Separator + , defaultButtonAttributes + , buttonTemplate; + +buttonTemplate = _.template( + '
  • ' +); + +defaultButtonAttributes = function (name, overrides) { + return { + id: name, + key: name, + localizationId: "pad.toolbar." + name + ".title", + icon: "buttonicon-" + name + }; +}; + +defaultButtons = { + bold: defaultButtonAttributes("bold"), + italic: defaultButtonAttributes("italic"), + underline: defaultButtonAttributes("underline"), + strikethrough: defaultButtonAttributes("strikethrough"), + + orderedlist: { + id: "orderedlist", + key: "insertorderedlist", + localizationId: "pad.toolbar.ol.title", + icon: "buttonicon-insertorderedlist" + }, + + unorderedlist: { + id: "unorderedlist", + key: "insertunorderedlist", + localizationId: "pad.toolbar.ul.title", + icon: "buttonicon-insertunorderedlist" + }, + + indent: defaultButtonAttributes("indent"), + outdent: { + id: "outdent", + key: "outdent", + localizationId: "pad.toolbar.unindent.title", + icon: "buttonicon-outdent" + }, + + undo: defaultButtonAttributes("undo"), + redo: defaultButtonAttributes("redo"), + + clearauthorship: { + id: "clearAuthorship", + key: "clearauthorship", + localizationId: "pad.toolbar.clearAuthorship.title", + icon: "buttonicon-clearauthorship" + } + +}; + +ButtonsGroup = function () { + this.buttons = []; +}; + +ButtonsGroup.fromArray = function (array) { + var btnGroup = new ButtonsGroup(); + _.each(array, function (btnName) { + var b = new Button(defaultButtons[btnName]); + btnGroup.addButton(b); + }); + return btnGroup; +}; + +ButtonsGroup.prototype.addButton = function (button) { + this.buttons.push(button); + return this; +}; + +ButtonsGroup.prototype.render = function () { + if (this.buttons.length == 1) { + this.buttons[0].grouping = ""; + } + else { + _.first(this.buttons).grouping = "grouped-left"; + _.last(this.buttons).grouping = "grouped-right"; + _.each(this.buttons.slice(1, -1), function (btn) { + btn.grouping = "grouped-middle" + }); + } + + return _.map(this.buttons, function (btn) { + return btn.render(); + }).join("\n"); +}; + +Button = function (attributes) { + this.attributes = attributes; +}; + +Button.prototype.grouping = ""; +Button.prototype.render = function () { + return buttonTemplate(this); +}; + +Separator = function () {}; +Separator.prototype.render = function () { + return '
  • '; +}; + +module.exports = { + menu: function (buttons) { + var groups = _.map(buttons, function (group) { + return ButtonsGroup.fromArray(group).render(); + }); + return groups.join(new Separator().render()); + } +}; diff --git a/src/templates/pad.html b/src/templates/pad.html index 76df5133..bde1c7ee 100644 --- a/src/templates/pad.html +++ b/src/templates/pad.html @@ -1,6 +1,22 @@ <% var settings = require("ep_etherpad-lite/node/utils/Settings") , langs = require("ep_etherpad-lite/node/hooks/i18n").availableLangs + , toolbar = require("ep_etherpad-lite/node/utils/toolbar") + , leftToolbar + , rightToolbar; + + + if (settings.ep_toolbar && settings.ep_toolbar.left) { + leftToolbar = settings.ep_toolbar.left; + } + else { + leftToolbar = [ + ["bold", "italic", "underline", "strikethrough"], + ["orderedlist", "unorderedlist", "indent", "outdent"], + ["undo", "redo"], + ["clearauthorship"] + ]; + } %> <% e.begin_block("htmlHead"); %> @@ -54,66 +70,10 @@
    + + <% e.begin_block("afterEditbar"); %><% e.end_block(); %>
    <% e.begin_block("userlist"); %> From 3d8452b1439fd24473fb68653cb2f7e3e0bbdb4b Mon Sep 17 00:00:00 2001 From: Luc Didry Date: Thu, 5 Dec 2013 08:41:29 +0100 Subject: [PATCH 068/152] Replace tabs indentation with spaces indentation Some files are obviously external libraries, I didn't touch them --- bin/loadTesting/README | 14 +- bin/loadTesting/launcher.sh | 2 +- doc/easysync/easysync-notes.txt | 14 +- settings.json.template | 57 +- src/node/db/API.js | 4 +- src/node/db/Pad.js | 4 +- src/node/db/SecurityManager.js | 8 +- src/node/handler/PadMessageHandler.js | 6 +- src/node/handler/SocketIORouter.js | 10 +- src/node/hooks/express/padreadonly.js | 56 +- src/node/hooks/express/padurlsanitize.js | 22 +- src/node/hooks/express/specialpages.js | 6 +- src/node/utils/Abiword.js | 2 +- src/node/utils/ExportHtml.js | 20 +- src/static/css/iframe_editor.css | 2 +- src/static/js/Changeset.js | 6 +- src/static/js/ace2_inner.js | 4 +- src/static/js/broadcast_slider.js | 8 +- src/static/js/changesettracker.js | 4 +- src/static/js/chat.js | 14 +- src/static/js/contentcollector.js | 4 +- src/static/js/domline.js | 8 +- src/static/js/html10n.js | 20 +- src/static/js/linestylefilter.js | 2 +- src/static/js/pad_editbar.js | 2 +- src/static/js/pluginfw/hooks.js | 2 +- src/templates/index.html | 36 +- tests/frontend/lib/sendkeys.js | 606 +++++++++--------- tests/frontend/runner.js | 6 +- tests/frontend/specs/alphabet.js | 2 +- tests/frontend/specs/chat.js | 2 +- tests/frontend/specs/helper.js | 58 +- tests/frontend/specs/indentation.js | 4 +- tests/frontend/specs/urls_become_clickable.js | 2 +- tests/frontend/travis/remote_runner.js | 4 +- 35 files changed, 511 insertions(+), 510 deletions(-) diff --git a/bin/loadTesting/README b/bin/loadTesting/README index 2252b66c..c8ecd71e 100644 --- a/bin/loadTesting/README +++ b/bin/loadTesting/README @@ -17,19 +17,19 @@ Installed Xvfb and PhantomJS I installed Xvfb following (roughly) this guide: http://blog.martin-lyness.com/archives/installing-xvfb-on-ubuntu-9-10-karmic-koala - #sudo apt-get install xvfb - #sudo apt-get install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic + #sudo apt-get install xvfb + #sudo apt-get install xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-cyrillic Launched two instances of Xvfb directly from the terminal: - #Xvfb :0 -ac - #Xvfb :1 -ac + #Xvfb :0 -ac + #Xvfb :1 -ac I installed PhantomJS following this guide: http://code.google.com/p/phantomjs/wiki/Installation - #sudo add-apt-repository ppa:jerome-etienne/neoip - #sudo apt-get update - #sudo apt-get install phantomjs + #sudo add-apt-repository ppa:jerome-etienne/neoip + #sudo apt-get update + #sudo apt-get install phantomjs I created a small JavaScript file for PhatomJS to use to control the browser instances: diff --git a/bin/loadTesting/launcher.sh b/bin/loadTesting/launcher.sh index 375b1544..e940f8e0 100755 --- a/bin/loadTesting/launcher.sh +++ b/bin/loadTesting/launcher.sh @@ -3,7 +3,7 @@ # connect 500 instances to display :0 for i in {1..500} do - echo $i + echo $i echo "Displaying Some shit" DISPLAY=:0 screen -d -m /home/phantomjs/bin/phantomjs loader.js http://10.0.0.55:9001/p/pad2 && sleep 2 done diff --git a/doc/easysync/easysync-notes.txt b/doc/easysync/easysync-notes.txt index d3b3dc55..72adadd2 100644 --- a/doc/easysync/easysync-notes.txt +++ b/doc/easysync/easysync-notes.txt @@ -79,14 +79,14 @@ Here are descriptions of the operations, where capital letters are variables: kept MUST be a newline, and the final newline of the document is allowed. "*I" : Apply attribute I from the pool to the following +, =, |+, or |= command. In other words, any number of * ops can come before a +, =, or | but not - between a | and the corresponding + or =. + between a | and the corresponding + or =. If +, text is inserted having this attribute. If =, text is kept but with - the attribute applied as an attribute addition or removal. - Consecutive attributes must be sorted lexically by (key,value) with key - and value taken as strings. It's illegal to have duplicate keys - for (key,value) pairs that apply to the same text. It's illegal to - have an empty value for a key in the case of an insertion (+), the - pair should just be omitted. + the attribute applied as an attribute addition or removal. + Consecutive attributes must be sorted lexically by (key,value) with key + and value taken as strings. It's illegal to have duplicate keys + for (key,value) pairs that apply to the same text. It's illegal to + have an empty value for a key in the case of an insertion (+), the + pair should just be omitted. Characters from the source text that aren't accounted for are assumed to be kept with the same attributes. diff --git a/settings.json.template b/settings.json.template index 50e7e9d4..43aa1613 100644 --- a/settings.json.template +++ b/settings.json.template @@ -110,40 +110,41 @@ // https://github.com/nomiddlename/log4js-node // You can add as many appenders as you want here: "logconfig" : - { "appenders": [ - { "type": "console" - //, "category": "access"// only logs pad access - } + { "appenders": [ + { "type": "console" + //, "category": "access"// only logs pad access + } /* - , { "type": "file" + , { "type": "file" , "filename": "your-log-file-here.log" , "maxLogSize": 1024 , "backups": 3 // how many log files there're gonna be at max //, "category": "test" // only log a specific category - }*/ + }*/ /* - , { "type": "logLevelFilter" - , "level": "warn" // filters out all log messages that have a lower level than "error" - , "appender": - { Use whatever appender you want here } - }*/ + , { "type": "logLevelFilter" + , "level": "warn" // filters out all log messages that have a lower level than "error" + , "appender": + { Use whatever appender you want here } + }*/ /* - , { "type": "logLevelFilter" - , "level": "error" // filters out all log messages that have a lower level than "error" - , "appender": - { "type": "smtp" - , "subject": "An error occured in your EPL instance!" - , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" - , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message - , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods - "host": "smtp.example.com", "port": 465, - "secureConnection": true, - "auth": { - "user": "foo@example.com", - "pass": "bar_foo" + , { "type": "logLevelFilter" + , "level": "error" // filters out all log messages that have a lower level than "error" + , "appender": + { "type": "smtp" + , "subject": "An error occured in your EPL instance!" + , "recipients": "bar@blurdybloop.com, baz@blurdybloop.com" + , "sendInterval": 60*5 // in secs -- will buffer log messages; set to 0 to send a mail for every message + , "transport": "SMTP", "SMTP": { // see https://github.com/andris9/Nodemailer#possible-transport-methods + "host": "smtp.example.com", "port": 465, + "secureConnection": true, + "auth": { + "user": "foo@example.com", + "pass": "bar_foo" + } } - } - } - }*/ - ] } + } + }*/ + ] + } } diff --git a/src/node/db/API.js b/src/node/db/API.js index e48c1401..349953cb 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -554,7 +554,7 @@ exports.deletePad = function(padID, callback) /** copyPad(sourceID, destinationID[, force=false]) copies a pad. If force is true, - the destination will be overwritten if it exists. + the destination will be overwritten if it exists. Example returns: @@ -573,7 +573,7 @@ exports.copyPad = function(sourceID, destinationID, force, callback) /** movePad(sourceID, destinationID[, force=false]) moves a pad. If force is true, - the destination will be overwritten if it exists. + the destination will be overwritten if it exists. Example returns: diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index b6dee897..180517d1 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -463,7 +463,7 @@ Pad.prototype.copy = function copy(destinationID, force, callback) { if(exists == true) { - if (!force) + if (!force) { console.log("erroring out without force"); callback(new customError("destinationID already exists","apierror")); @@ -635,7 +635,7 @@ Pad.prototype.remove = function remove(callback) { authorIDs.forEach(function (authorID) { - authorManager.removePad(authorID, padID); + authorManager.removePad(authorID, padID); }); callback(); diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index 355603f3..66cfd292 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -151,16 +151,16 @@ exports.checkAccess = function (padID, sessionCookie, token, password, callback) if(sessionInfo.groupID != groupID) { authLogger.debug("Auth failed: wrong group"); - callback(); - return; + callback(); + return; } //is validUntil still ok? if(sessionInfo.validUntil <= now) { authLogger.debug("Auth failed: validUntil"); - callback(); - return; + callback(); + return; } // There is a valid session diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 0b583661..75ec6bd7 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -455,7 +455,7 @@ function handleGetChatMessages(client, message) pad.getChatMessages(start, end, function(err, chatMessages) { if(ERR(err, callback)) return; - + var infoMsg = { type: "COLLABROOM", data: { @@ -463,7 +463,7 @@ function handleGetChatMessages(client, message) messages: chatMessages } }; - + // send the messages back to the client client.json.send(infoMsg); }); @@ -1564,7 +1564,7 @@ exports.padUsers = function (padID, callback) { author.id = s.author; result.push(author); - callback(); + callback(); }); } }, function(err) { diff --git a/src/node/handler/SocketIORouter.js b/src/node/handler/SocketIORouter.js index 2ca0d80f..b3e046d2 100644 --- a/src/node/handler/SocketIORouter.js +++ b/src/node/handler/SocketIORouter.js @@ -57,11 +57,11 @@ exports.setSocketIO = function(_socket) { socket.sockets.on('connection', function(client) { if(settings.trustProxy && client.handshake.headers['x-forwarded-for'] !== undefined){ - client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); - } - else{ - client.set('remoteAddress', client.handshake.address.address); - } + client.set('remoteAddress', client.handshake.headers['x-forwarded-for']); + } + else{ + client.set('remoteAddress', client.handshake.address.address); + } var clientAuthorized = false; //wrap the original send function to log the messages diff --git a/src/node/hooks/express/padreadonly.js b/src/node/hooks/express/padreadonly.js index af5cbed3..9a0a52bf 100644 --- a/src/node/hooks/express/padreadonly.js +++ b/src/node/hooks/express/padreadonly.js @@ -16,50 +16,50 @@ exports.expressCreateServer = function (hook_name, args, cb) { //translate the read only pad to a padId function(callback) { - readOnlyManager.getPadId(req.params.id, function(err, _padId) - { - if(ERR(err, callback)) return; + readOnlyManager.getPadId(req.params.id, function(err, _padId) + { + if(ERR(err, callback)) return; - padId = _padId; + padId = _padId; - //we need that to tell hasPadAcess about the pad - req.params.pad = padId; + //we need that to tell hasPadAcess about the pad + req.params.pad = padId; - callback(); - }); + callback(); + }); }, //render the html document function(callback) { - //return if the there is no padId - if(padId == null) - { - callback("notfound"); - return; - } + //return if the there is no padId + if(padId == null) + { + callback("notfound"); + return; + } - hasPadAccess(req, res, function() - { - //render the html document - exporthtml.getPadHTMLDocument(padId, null, false, function(err, _html) - { - if(ERR(err, callback)) return; - html = _html; - callback(); - }); - }); + hasPadAccess(req, res, function() + { + //render the html document + exporthtml.getPadHTMLDocument(padId, null, false, function(err, _html) + { + if(ERR(err, callback)) return; + html = _html; + callback(); + }); + }); } ], function(err) { //throw any unexpected error if(err && err != "notfound") - ERR(err); + ERR(err); if(err == "notfound") - res.send(404, '404 - Not Found'); + res.send(404, '404 - Not Found'); else - res.send(html); + res.send(html); }); }); -} \ No newline at end of file +} diff --git a/src/node/hooks/express/padurlsanitize.js b/src/node/hooks/express/padurlsanitize.js index 29782b69..2aadccdc 100644 --- a/src/node/hooks/express/padurlsanitize.js +++ b/src/node/hooks/express/padurlsanitize.js @@ -12,20 +12,20 @@ exports.expressCreateServer = function (hook_name, args, cb) { else { padManager.sanitizePadId(padId, function(sanitizedPadId) { - //the pad id was sanitized, so we redirect to the sanitized version - if(sanitizedPadId != padId) - { + //the pad id was sanitized, so we redirect to the sanitized version + if(sanitizedPadId != padId) + { var real_url = sanitizedPadId; var query = url.parse(req.url).query; if ( query ) real_url += '?' + query; - res.header('Location', real_url); - res.send(302, 'You should be redirected to ' + real_url + ''); - } - //the pad id was fine, so just render it - else - { - next(); - } + res.header('Location', real_url); + res.send(302, 'You should be redirected to ' + real_url + ''); + } + //the pad id was fine, so just render it + else + { + next(); + } }); } }); diff --git a/src/node/hooks/express/specialpages.js b/src/node/hooks/express/specialpages.js index 6701726e..7d051965 100644 --- a/src/node/hooks/express/specialpages.js +++ b/src/node/hooks/express/specialpages.js @@ -49,11 +49,11 @@ exports.expressCreateServer = function (hook_name, args, cb) { //there is no custom favicon, send the default favicon if(err) { - filePath = path.normalize(__dirname + "/../../../static/favicon.ico"); - res.sendfile(filePath); + filePath = path.normalize(__dirname + "/../../../static/favicon.ico"); + res.sendfile(filePath); } }); }); -} \ No newline at end of file +} diff --git a/src/node/utils/Abiword.js b/src/node/utils/Abiword.js index 2ef4f444..5f12bd97 100644 --- a/src/node/utils/Abiword.js +++ b/src/node/utils/Abiword.js @@ -143,7 +143,7 @@ else //Queue with the converts we have to do var queue = async.queue(doConvertTask, 1); exports.convertFile = function(srcFile, destFile, type, callback) - { + { queue.push({"srcFile": srcFile, "destFile": destFile, "type": type, "callback": callback}); }; } diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index 7b94310a..5179adf6 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -447,7 +447,7 @@ function getHTMLFromAtext(pad, atext, authorColors) pieces.push(''); } lists.length--; - } + } var lineContentFromHook = hooks.callAllStr("getLineHTMLForExport", { line: line, @@ -455,14 +455,14 @@ function getHTMLFromAtext(pad, atext, authorColors) attribLine: attribLines[i], text: textLines[i] }, " ", " ", ""); - if (lineContentFromHook) - { - pieces.push(lineContentFromHook, ''); - } - else - { - pieces.push(lineContent, '
    '); - } + if (lineContentFromHook) + { + pieces.push(lineContentFromHook, ''); + } + else + { + pieces.push(lineContent, '
    '); + } } } @@ -490,7 +490,7 @@ exports.getPadHTMLDocument = function (padId, revNum, noDocType, callback) var head = (noDocType ? '' : '\n') + '\n' + (noDocType ? '' : '\n' + - '' + Security.escapeHTML(padId) + '\n' + + '' + Security.escapeHTML(padId) + '\n' + '\n' + '"; } + // iterates over all props(h1,h2,strong,...), checks if it is used in + // this pad, and if yes puts its attrib id->props value into anumMap props.forEach(function (propName, i) { var propTrueNum = apool.putAttrib([propName, true], true); @@ -128,7 +134,10 @@ function getHTMLFromAtext(pad, atext, authorColors) function getLineHTML(text, attribs) { - var propVals = [false, false, false]; + // the current state of every attrib + // false if a tag was not seen or after it was pushed to tags2close + // true after emitOpenTag was called + var propVals = [false, false, false, false, false, false]; //every supported attrib var ENTER = 1; var STAY = 2; var LEAVE = 0; @@ -188,7 +197,15 @@ function getHTMLFromAtext(pad, atext, authorColors) assem.append('>'); } } - + + // this function takes an array of tags that should be closed + // it iterates over the array of open tags and tags2close and if it + // finds a match, it calls emitCloseTag (which removes and + // closes it) and decreases the iteration counter by one + // this ensures, that multiple tags can be closed: + // opentags = ['strong','em','s'] + // closetags = ['s','em'] + // function orderdCloseTags(tags2close) { for(var i=0;i Date: Sun, 8 Dec 2013 11:34:11 +0100 Subject: [PATCH 075/152] some more docs for attribute export and cleanup empty lines --- src/node/utils/ExportHtml.js | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/node/utils/ExportHtml.js b/src/node/utils/ExportHtml.js index b5a03757..53e27cc7 100644 --- a/src/node/utils/ExportHtml.js +++ b/src/node/utils/ExportHtml.js @@ -92,24 +92,24 @@ function getHTMLFromAtext(pad, atext, authorColors) if(authorColors){ css+="', '', scriptTag(outerScript), '
    x
    '); + outerHTML.push('', '', scriptTag(outerScript), '
    x
    '); var outerFrame = document.createElement("IFRAME"); outerFrame.name = "ace_outer"; diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 2798de44..ec842285 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -79,7 +79,6 @@ function Ace2Inner(){ iframe.ace_outerWin = null; // prevent IE 6 memory leak var sideDiv = iframe.nextSibling; var lineMetricsDiv = sideDiv.nextSibling; - var overlaysdiv = lineMetricsDiv.nextSibling; initLineNumbers(); var outsideKeyDown = noop; From e04f46d4775037d712c5fa07dedda58e443b43d2 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:25:12 +0100 Subject: [PATCH 092/152] [ace2_inner] init() has replaced setup(), reflect this change in the comments and remove the unused setup() --- src/static/js/ace2_inner.js | 52 ++----------------------------------- 1 file changed, 2 insertions(+), 50 deletions(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index ec842285..9391e4ed 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -101,13 +101,13 @@ function Ace2Inner(){ apool: new AttribPool() }; - // lines, alltext, alines, and DOM are set up in setup() + // lines, alltext, alines, and DOM are set up in init() if (undoModule.enabled) { undoModule.apool = rep.apool; } - var root, doc; // set in setup() + var root, doc; // set in init() var isEditable = true; var doesWrap = true; var hasLineNumbers = true; @@ -4768,54 +4768,6 @@ function Ace2Inner(){ else $(elem).removeClass(className); } - function setup() - { - doc = document; // defined as a var in scope outside - inCallStackIfNecessary("setup", function() - { - var body = doc.getElementById("innerdocbody"); - root = body; // defined as a var in scope outside - if (browser.mozilla) addClass(root, "mozilla"); - if (browser.safari) addClass(root, "safari"); - if (browser.msie) addClass(root, "msie"); - if (browser.msie) - { - // cache CSS background images - try - { - doc.execCommand("BackgroundImageCache", false, true); - } - catch (e) - { /* throws an error in some IE 6 but not others! */ - } - } - setClassPresence(root, "authorColors", true); - setClassPresence(root, "doesWrap", doesWrap); - - initDynamicCSS(); - - enforceEditability(); - - // set up dom and rep - while (root.firstChild) root.removeChild(root.firstChild); - var oneEntry = createDomLineEntry(""); - doRepLineSplice(0, rep.lines.length(), [oneEntry]); - insertDomLines(null, [oneEntry.domInfo], null); - rep.alines = Changeset.splitAttributionLines( - Changeset.makeAttribution("\n"), "\n"); - - bindTheEventHandlers(); - - }); - - scheduler.setTimeout(function() - { - parent.readyFunc(); // defined in code that sets up the inner iframe - }, 0); - - isSetUp = true; - } - function focus() { window.focus(); From 021db28a0234fe524717642463490c1b3e37e711 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:27:48 +0100 Subject: [PATCH 093/152] [Changeset] a?lines_length was not used within inverse function --- src/static/js/Changeset.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index 77bd3a4c..e47b3052 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -1841,14 +1841,6 @@ exports.inverse = function (cs, lines, alines, pool) { } } - function lines_length() { - if ((typeof lines.length) == "number") { - return lines.length; - } else { - return lines.length(); - } - } - function alines_get(idx) { if (alines.get) { return alines.get(idx); @@ -1857,14 +1849,6 @@ exports.inverse = function (cs, lines, alines, pool) { } } - function alines_length() { - if ((typeof alines.length) == "number") { - return alines.length; - } else { - return alines.length(); - } - } - var curLine = 0; var curChar = 0; var curLineOpIter = null; From ca6f877db20a7f12d3bbed0409cdb2b32dae7569 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:28:43 +0100 Subject: [PATCH 094/152] [padDiff] remove unused functions a?lines_length --- src/node/utils/padDiff.js | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/src/node/utils/padDiff.js b/src/node/utils/padDiff.js index c5354041..88fa5cba 100644 --- a/src/node/utils/padDiff.js +++ b/src/node/utils/padDiff.js @@ -331,14 +331,6 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { } } - function lines_length() { - if ((typeof lines.length) == "number") { - return lines.length; - } else { - return lines.length(); - } - } - function alines_get(idx) { if (alines.get) { return alines.get(idx); @@ -347,14 +339,6 @@ PadDiff.prototype._createDeletionChangeset = function(cs, startAText, apool) { } } - function alines_length() { - if ((typeof alines.length) == "number") { - return alines.length; - } else { - return alines.length(); - } - } - var curLine = 0; var curChar = 0; var curLineOpIter = null; From aadcfbb3d153c191109a7fce1ac2795c220611cc Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:29:41 +0100 Subject: [PATCH 095/152] do not send globalPadId in clientvars - its not used anywhere --- src/node/handler/PadMessageHandler.js | 2 -- src/static/js/collab_client.js | 1 - 2 files changed, 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 75ec6bd7..748b8382 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1076,7 +1076,6 @@ function handleClientReady(client, message) "historicalAuthorData": historicalAuthorData, "apool": apool, "rev": pad.getHeadRevisionNumber(), - "globalPadId": message.padId, "time": currentTime, }, "colorPalette": authorManager.getColorPalette(), @@ -1093,7 +1092,6 @@ function handleClientReady(client, message) "readOnlyId": padIds.readOnlyPadId, "readonly": padIds.readonly, "serverTimestamp": new Date().getTime(), - "globalPadId": message.padId, "userId": author, "abiwordAvailable": settings.abiwordAvailable(), "plugins": { diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index 8dfcfc64..b51b0809 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -40,7 +40,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) var rev = serverVars.rev; var padId = serverVars.padId; - var globalPadId = serverVars.globalPadId; var state = "IDLE"; var stateMessage; From 6aaf4c40655d04c14a2d1dc98ceca4dde4fb3e70 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:30:25 +0100 Subject: [PATCH 096/152] [collab_client] remove keys function, which was not used and variable reconnectTimes which was used for some long gone disconnect tracking code --- src/static/js/collab_client.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index b51b0809..ce732b58 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -54,7 +54,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) var userSet = {}; // userId -> userInfo userSet[userId] = initialUserInfo; - var reconnectTimes = []; var caughtErrors = []; var caughtErrorCatchers = []; var caughtErrorTimes = []; @@ -501,16 +500,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) } } - function keys(obj) - { - var array = []; - $.each(obj, function(k, v) - { - array.push(k); - }); - return array; - } - function valuesArray(obj) { var array = []; From 1fa8c2a7e61b75c8976fb5bcb3b7ae6dde6493e8 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:30:48 +0100 Subject: [PATCH 097/152] [collab_client] remove unused function getStats --- src/static/js/collab_client.js | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/static/js/collab_client.js b/src/static/js/collab_client.js index ce732b58..146ec51b 100644 --- a/src/static/js/collab_client.js +++ b/src/static/js/collab_client.js @@ -204,17 +204,6 @@ function getCollabClient(ace2editor, serverVars, initialUserInfo, options, _pad) } } - function getStats() - { - var stats = {}; - - stats.screen = [$(window).width(), $(window).height(), window.screen.availWidth, window.screen.availHeight, window.screen.width, window.screen.height].join(','); - stats.ip = serverVars.clientIp; - stats.useragent = serverVars.clientAgent; - - return stats; - } - function setUpSocket() { hiccupCount = 0; From 906ab1820b8555d018cb783840e7b368edfdfbe8 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:31:18 +0100 Subject: [PATCH 098/152] [timeslider] do not include underscore, as its not (longer) used --- src/static/js/timeslider.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index 19489961..fd22c69a 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -28,7 +28,6 @@ JSON = require('./json2'); var createCookie = require('./pad_utils').createCookie; var readCookie = require('./pad_utils').readCookie; var randomString = require('./pad_utils').randomString; -var _ = require('./underscore'); var hooks = require('./pluginfw/hooks'); var token, padId, export_links; From ab797c9831d08f521fb0dfdd1e776d36b0945e91 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:31:46 +0100 Subject: [PATCH 099/152] [pad_connectionstatus] padeditbar is not used anywhere in pad_connectionstatus --- src/static/js/pad_connectionstatus.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/static/js/pad_connectionstatus.js b/src/static/js/pad_connectionstatus.js index 4cbf1642..76eedbc4 100644 --- a/src/static/js/pad_connectionstatus.js +++ b/src/static/js/pad_connectionstatus.js @@ -21,7 +21,6 @@ */ var padmodals = require('./pad_modals').padmodals; -var padeditbar = require('./pad_editbar').padeditbar; var padconnectionstatus = (function() { From 9400425b1eef135cc671c866da39c116d7e82b17 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:33:58 +0100 Subject: [PATCH 100/152] [virtual_lines] remove traces of virtual_lines/makeVirtualLineView. this code was used for FF2 key handling code and is long unused --- src/node/utils/tar.json | 1 - src/static/js/ace2_inner.js | 1 - src/static/js/virtual_lines.js | 388 --------------------------------- 3 files changed, 390 deletions(-) delete mode 100644 src/static/js/virtual_lines.js diff --git a/src/node/utils/tar.json b/src/node/utils/tar.json index b010f851..70001f8f 100644 --- a/src/node/utils/tar.json +++ b/src/node/utils/tar.json @@ -46,7 +46,6 @@ , "Changeset.js" , "ChangesetUtils.js" , "skiplist.js" - , "virtual_lines.js" , "cssmanager.js" , "colorutils.js" , "undomodule.js" diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 9391e4ed..1c5fcad5 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -51,7 +51,6 @@ function Ace2Inner(){ var linestylefilter = require('./linestylefilter').linestylefilter; var SkipList = require('./skiplist'); var undoModule = require('./undomodule').undoModule; - var makeVirtualLineView = require('./virtual_lines').makeVirtualLineView; var AttributeManager = require('./AttributeManager'); var DEBUG = false; //$$ build script replaces the string "var DEBUG=true;//$$" with "var DEBUG=false;" diff --git a/src/static/js/virtual_lines.js b/src/static/js/virtual_lines.js deleted file mode 100644 index 2bcf5ed6..00000000 --- a/src/static/js/virtual_lines.js +++ /dev/null @@ -1,388 +0,0 @@ -/** - * This code is mostly from the old Etherpad. Please help us to comment this code. - * This helps other people to understand this code better and helps them to improve it. - * TL;DR COMMENTS ON THIS FILE ARE HIGHLY APPRECIATED - */ - -/** - * Copyright 2009 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS-IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -function makeVirtualLineView(lineNode) -{ - - // how much to jump forward or backward at once in a charSeeker before - // constructing a DOM node and checking the coordinates (which takes a - // significant fraction of a millisecond). From the - // coordinates and the approximate line height we can estimate how - // many lines we have moved. We risk being off if the number of lines - // we move is on the order of the line height in pixels. Fortunately, - // when the user boosts the font-size they increase both. - var maxCharIncrement = 20; - var seekerAtEnd = null; - - function getNumChars() - { - return lineNode.textContent.length; - } - - function getNumVirtualLines() - { - if (!seekerAtEnd) - { - var seeker = makeCharSeeker(); - seeker.forwardByWhile(maxCharIncrement); - seekerAtEnd = seeker; - } - return seekerAtEnd.getVirtualLine() + 1; - } - - function getVLineAndOffsetForChar(lineChar) - { - var seeker = makeCharSeeker(); - seeker.forwardByWhile(maxCharIncrement, null, lineChar); - var theLine = seeker.getVirtualLine(); - seeker.backwardByWhile(8, function() - { - return seeker.getVirtualLine() == theLine; - }); - seeker.forwardByWhile(1, function() - { - return seeker.getVirtualLine() != theLine; - }); - var lineStartChar = seeker.getOffset(); - return { - vline: theLine, - offset: (lineChar - lineStartChar) - }; - } - - function getCharForVLineAndOffset(vline, offset) - { - // returns revised vline and offset as well as absolute char index within line. - // if offset is beyond end of line, for example, will give new offset at end of line. - var seeker = makeCharSeeker(); - // go to start of line - seeker.binarySearch(function() - { - return seeker.getVirtualLine() >= vline; - }); - var lineStart = seeker.getOffset(); - var theLine = seeker.getVirtualLine(); - // go to offset, overshooting the virtual line only if offset is too large for it - seeker.forwardByWhile(maxCharIncrement, null, lineStart + offset); - // get back into line - seeker.backwardByWhile(1, function() - { - return seeker.getVirtualLine() != theLine; - }, lineStart); - var lineChar = seeker.getOffset(); - var theOffset = lineChar - lineStart; - // handle case of last virtual line; should be able to be at end of it - if (theOffset < offset && theLine == (getNumVirtualLines() - 1)) - { - var lineLen = getNumChars(); - theOffset += lineLen - lineChar; - lineChar = lineLen; - } - - return { - vline: theLine, - offset: theOffset, - lineChar: lineChar - }; - } - - return { - getNumVirtualLines: getNumVirtualLines, - getVLineAndOffsetForChar: getVLineAndOffsetForChar, - getCharForVLineAndOffset: getCharForVLineAndOffset, - makeCharSeeker: function() - { - return makeCharSeeker(); - } - }; - - function deepFirstChildTextNode(nd) - { - nd = nd.firstChild; - while (nd && nd.firstChild) nd = nd.firstChild; - if (nd.data) return nd; - return null; - } - - function makeCharSeeker( /*lineNode*/ ) - { - - function charCoords(tnode, i) - { - var container = tnode.parentNode; - - // treat space specially; a space at the end of a virtual line - // will have weird coordinates - var isSpace = (tnode.nodeValue.charAt(i) === " "); - if (isSpace) - { - if (i == 0) - { - if (container.previousSibling && deepFirstChildTextNode(container.previousSibling)) - { - tnode = deepFirstChildTextNode(container.previousSibling); - i = tnode.length - 1; - container = tnode.parentNode; - } - else - { - return { - top: container.offsetTop, - left: container.offsetLeft - }; - } - } - else - { - i--; // use previous char - } - } - - - var charWrapper = document.createElement("SPAN"); - - // wrap the character - var tnodeText = tnode.nodeValue; - var frag = document.createDocumentFragment(); - frag.appendChild(document.createTextNode(tnodeText.substring(0, i))); - charWrapper.appendChild(document.createTextNode(tnodeText.substr(i, 1))); - frag.appendChild(charWrapper); - frag.appendChild(document.createTextNode(tnodeText.substring(i + 1))); - container.replaceChild(frag, tnode); - - var result = { - top: charWrapper.offsetTop, - left: charWrapper.offsetLeft + (isSpace ? charWrapper.offsetWidth : 0), - height: charWrapper.offsetHeight - }; - - while (container.firstChild) container.removeChild(container.firstChild); - container.appendChild(tnode); - - return result; - } - - var lineText = lineNode.textContent; - var lineLength = lineText.length; - - var curNode = null; - var curChar = 0; - var curCharWithinNode = 0 - var curTop; - var curLeft; - var approxLineHeight; - var whichLine = 0; - - function nextNode() - { - var n = curNode; - if (!n) n = lineNode.firstChild; - else n = n.nextSibling; - while (n && !deepFirstChildTextNode(n)) - { - n = n.nextSibling; - } - return n; - } - - function prevNode() - { - var n = curNode; - if (!n) n = lineNode.lastChild; - else n = n.previousSibling; - while (n && !deepFirstChildTextNode(n)) - { - n = n.previousSibling; - } - return n; - } - - var seeker; - if (lineLength > 0) - { - curNode = nextNode(); - var firstCharData = charCoords(deepFirstChildTextNode(curNode), 0); - approxLineHeight = firstCharData.height; - curTop = firstCharData.top; - curLeft = firstCharData.left; - - function updateCharData(tnode, i) - { - var coords = charCoords(tnode, i); - whichLine += Math.round((coords.top - curTop) / approxLineHeight); - curTop = coords.top; - curLeft = coords.left; - } - - seeker = { - forward: function(numChars) - { - var oldChar = curChar; - var newChar = curChar + numChars; - if (newChar > (lineLength - 1)) newChar = lineLength - 1; - while (curChar < newChar) - { - var curNodeLength = deepFirstChildTextNode(curNode).length; - var toGo = curNodeLength - curCharWithinNode; - if (curChar + toGo > newChar || !nextNode()) - { - // going to next node would be too far - var n = newChar - curChar; - if (n >= toGo) n = toGo - 1; - curChar += n; - curCharWithinNode += n; - break; - } - else - { - // go to next node - curChar += toGo; - curCharWithinNode = 0; - curNode = nextNode(); - } - } - updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode); - return curChar - oldChar; - }, - backward: function(numChars) - { - var oldChar = curChar; - var newChar = curChar - numChars; - if (newChar < 0) newChar = 0; - while (curChar > newChar) - { - if (curChar - curCharWithinNode <= newChar || !prevNode()) - { - // going to prev node would be too far - var n = curChar - newChar; - if (n > curCharWithinNode) n = curCharWithinNode; - curChar -= n; - curCharWithinNode -= n; - break; - } - else - { - // go to prev node - curChar -= curCharWithinNode + 1; - curNode = prevNode(); - curCharWithinNode = deepFirstChildTextNode(curNode).length - 1; - } - } - updateCharData(deepFirstChildTextNode(curNode), curCharWithinNode); - return oldChar - curChar; - }, - getVirtualLine: function() - { - return whichLine; - }, - getLeftCoord: function() - { - return curLeft; - } - }; - } - else - { - curLeft = lineNode.offsetLeft; - seeker = { - forward: function(numChars) - { - return 0; - }, - backward: function(numChars) - { - return 0; - }, - getVirtualLine: function() - { - return 0; - }, - getLeftCoord: function() - { - return curLeft; - } - }; - } - seeker.getOffset = function() - { - return curChar; - }; - seeker.getLineLength = function() - { - return lineLength; - }; - seeker.toString = function() - { - return "seeker[curChar: " + curChar + "(" + lineText.charAt(curChar) + "), left: " + seeker.getLeftCoord() + ", vline: " + seeker.getVirtualLine() + "]"; - }; - - function moveByWhile(isBackward, amount, optCondFunc, optCharLimit) - { - var charsMovedLast = null; - var hasCondFunc = ((typeof optCondFunc) == "function"); - var condFunc = optCondFunc; - var hasCharLimit = ((typeof optCharLimit) == "number"); - var charLimit = optCharLimit; - while (charsMovedLast !== 0 && ((!hasCondFunc) || condFunc())) - { - var toMove = amount; - if (hasCharLimit) - { - var untilLimit = (isBackward ? curChar - charLimit : charLimit - curChar); - if (untilLimit < toMove) toMove = untilLimit; - } - if (toMove < 0) break; - charsMovedLast = (isBackward ? seeker.backward(toMove) : seeker.forward(toMove)); - } - } - - seeker.forwardByWhile = function(amount, optCondFunc, optCharLimit) - { - moveByWhile(false, amount, optCondFunc, optCharLimit); - } - seeker.backwardByWhile = function(amount, optCondFunc, optCharLimit) - { - moveByWhile(true, amount, optCondFunc, optCharLimit); - } - seeker.binarySearch = function(condFunc) - { - // returns index of boundary between false chars and true chars; - // positions seeker at first true char, or else last char - var trueFunc = condFunc; - var falseFunc = function() - { - return !condFunc(); - }; - seeker.forwardByWhile(20, falseFunc); - seeker.backwardByWhile(20, trueFunc); - seeker.forwardByWhile(10, falseFunc); - seeker.backwardByWhile(5, trueFunc); - seeker.forwardByWhile(1, falseFunc); - return seeker.getOffset() + (condFunc() ? 0 : 1); - } - - return seeker; - } - -} - -exports.makeVirtualLineView = makeVirtualLineView; From 77cf2aafacf859b053ee2d704f6b2ce0d4df5a71 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Sun, 8 Dec 2013 17:35:11 +0100 Subject: [PATCH 101/152] [pad_modals] remove unused variables. for the hide/show functions jquery's default variables are used everywhere --- src/static/js/pad_modals.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/static/js/pad_modals.js b/src/static/js/pad_modals.js index 39094a7e..67b03662 100644 --- a/src/static/js/pad_modals.js +++ b/src/static/js/pad_modals.js @@ -20,7 +20,6 @@ * limitations under the License. */ -var padutils = require('./pad_utils').padutils; var padeditbar = require('./pad_editbar').padeditbar; var padmodals = (function() @@ -39,10 +38,10 @@ var padmodals = (function() padeditbar.toggleDropDown("connectivity"); }); }, - showOverlay: function(duration) { + showOverlay: function() { $("#overlay").show(); }, - hideOverlay: function(duration) { + hideOverlay: function() { $("#overlay").hide(); } }; From 3180b96213ab0e8f18be5370899bb515e0afcb72 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 9 Dec 2013 18:13:07 +0000 Subject: [PATCH 102/152] Remove console logs --- src/node/handler/ImportHandler.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/node/handler/ImportHandler.js b/src/node/handler/ImportHandler.js index 3e00be77..c751f8f9 100644 --- a/src/node/handler/ImportHandler.js +++ b/src/node/handler/ImportHandler.js @@ -103,9 +103,7 @@ exports.doImport = function(req, res, padId) // Logic for allowing external Import Plugins hooks.aCallAll("import", {srcFile: srcFile, destFile: destFile}, function(err, result){ if(ERR(err, callback)) return callback(); -console.log(result); if(result.length > 0){ // This feels hacky and wrong.. - console.log("Plugin handling import"); importHandledByPlugin = true; callback(); }else{ @@ -191,7 +189,6 @@ console.log(result); function(callback) { var fileEnding = path.extname(srcFile).toLowerCase(); if (abiword || fileEnding == ".htm" || fileEnding == ".html") { -console.log("trying", fileEnding, abiword, text) try{ importHtml.setPadHTML(pad, text); }catch(e){ From 7dd29454e9ccf69bf3683fd7de9d6d7c1bfbd19d Mon Sep 17 00:00:00 2001 From: Lennart Brinkmann Date: Sat, 14 Dec 2013 19:56:49 +0100 Subject: [PATCH 103/152] Remove duplicate doc entry for setHTML() --- doc/api/http_api.md | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/doc/api/http_api.md b/doc/api/http_api.md index 281cc975..1ae2ea1c 100644 --- a/doc/api/http_api.md +++ b/doc/api/http_api.md @@ -285,16 +285,6 @@ sets the text of a pad * `{code: 1, message:"padID does not exist", data: null}` * `{code: 1, message:"text too long", data: null}` -#### setHTML(padID, html) - * API >= 1 - -sets the text of a pad based on HTML, HTML must be well formed. Malformed HTML will send a warning to the API log - -*Example returns:* - * `{code: 0, message:"ok", data: null}` - * `{code: 1, message:"padID does not exist", data: null}` - - #### getHTML(padID, [rev]) * API >= 1 @@ -304,15 +294,14 @@ returns the text of a pad formatted as HTML * `{code: 0, message:"ok", data: {html:"Welcome Text
    More Text"}}` * `{code: 1, message:"padID does not exist", data: null}` -#### setHTML(padID, text) +#### setHTML(padID, html) * API >= 1 -sets the html of a pad +sets the text of a pad based on HTML, HTML must be well formed. Malformed HTML will send a warning to the API log. *Example returns:* * `{code: 0, message:"ok", data: null}` * `{code: 1, message:"padID does not exist", data: null}` - * `{code: 1, message:"text too long", data: null}` #### getAttributePool(padID) * API >= 1.2.8 From dd8af99e2e36e759fdc869c82a24a271742e2a5b Mon Sep 17 00:00:00 2001 From: Lennart Brinkmann Date: Sat, 14 Dec 2013 21:14:56 +0100 Subject: [PATCH 104/152] Add input validation for html param in setHTML() --- src/node/db/API.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/node/db/API.js b/src/node/db/API.js index 00be1918..98bc8029 100644 --- a/src/node/db/API.js +++ b/src/node/db/API.js @@ -382,8 +382,23 @@ exports.getHTML = function(padID, rev, callback) }); } +/** +setHTML(padID, html) sets the text of a pad based on HTML + +Example returns: + +{code: 0, message:"ok", data: null} +{code: 1, message:"padID does not exist", data: null} +*/ exports.setHTML = function(padID, html, callback) { + //html is required + if(typeof html != "string") + { + callback(new customError("html is no string","apierror")); + return; + } + //get the pad getPadSafe(padID, true, function(err, pad) { From 6f6a86faa68740572078f99294df37ae170dd037 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Tue, 17 Dec 2013 08:52:50 +0000 Subject: [PATCH 105/152] Localisation updates from https://translatewiki.net. --- src/locales/ast.json | 6 +-- src/locales/da.json | 10 ++--- src/locales/de.json | 12 +++--- src/locales/es.json | 22 +++++----- src/locales/fa.json | 16 ++++---- src/locales/fi.json | 25 ++++++------ src/locales/fr.json | 34 ++++++++-------- src/locales/gl.json | 6 +-- src/locales/he.json | 12 +++--- src/locales/hu.json | 12 +++--- src/locales/it.json | 12 +++--- src/locales/ko.json | 8 ++-- src/locales/ksh.json | 6 +-- src/locales/lb.json | 8 ++-- src/locales/ms.json | 10 +++-- src/locales/ne.json | 86 ++++++++++++++++++++++++++++++++++++++++ src/locales/nn.json | 6 +-- src/locales/pl.json | 16 ++++---- src/locales/pt.json | 12 +++--- src/locales/sv.json | 8 ++-- src/locales/te.json | 10 ++--- src/locales/tr.json | 5 ++- src/locales/uk.json | 14 +++---- src/locales/zh-hans.json | 4 +- src/locales/zh-hant.json | 14 +++---- 25 files changed, 233 insertions(+), 141 deletions(-) create mode 100644 src/locales/ne.json diff --git a/src/locales/ast.json b/src/locales/ast.json index c02790d9..28fa2d0a 100644 --- a/src/locales/ast.json +++ b/src/locales/ast.json @@ -1,8 +1,8 @@ { "@metadata": { - "authors": { - "1": "Xuacu" - } + "authors": [ + "Xuacu" + ] }, "index.newPad": "Nuevu bloc", "index.createOpenPad": "o crear/abrir un bloc col nome:", diff --git a/src/locales/da.json b/src/locales/da.json index e508e540..fdcb4d7d 100644 --- a/src/locales/da.json +++ b/src/locales/da.json @@ -1,10 +1,10 @@ { "@metadata": { - "authors": { - "0": "Christian List", - "1": "Peter Alberti", - "3": "Steenth" - } + "authors": [ + "Christian List", + "Peter Alberti", + "Steenth" + ] }, "index.newPad": "Ny Pad", "index.createOpenPad": "eller opret/åbn en Pad med navnet:", diff --git a/src/locales/de.json b/src/locales/de.json index c2bc1b8c..8a4acd1c 100644 --- a/src/locales/de.json +++ b/src/locales/de.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "0": "Metalhead64", - "1": "Mklehr", - "2": "Nipsky", - "4": "Wikinaut" - } + "authors": [ + "Metalhead64", + "Mklehr", + "Nipsky", + "Wikinaut" + ] }, "index.newPad": "Neues Pad", "index.createOpenPad": "Pad mit folgendem Namen öffnen:", diff --git a/src/locales/es.json b/src/locales/es.json index 4b0200cb..eade2c9b 100644 --- a/src/locales/es.json +++ b/src/locales/es.json @@ -1,16 +1,16 @@ { "@metadata": { - "authors": { - "0": "Armando-Martin", - "1": "Jacobo", - "2": "Joker", - "3": "Larjona", - "4": "Mklehr", - "5": "Rubenwap", - "7": "VegaDark", - "8": "Vivaelcelta", - "9": "Xuacu" - } + "authors": [ + "Armando-Martin", + "Jacobo", + "Joker", + "Larjona", + "Mklehr", + "Rubenwap", + "VegaDark", + "Vivaelcelta", + "Xuacu" + ] }, "index.newPad": "Nuevo Pad", "index.createOpenPad": "o crea/abre un Pad con el nombre:", diff --git a/src/locales/fa.json b/src/locales/fa.json index 08456048..2cc29f01 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -1,13 +1,13 @@ { "@metadata": { - "authors": { - "0": "BMRG14", - "1": "Dalba", - "2": "Ebraminio", - "3": "Reza1615", - "5": "ZxxZxxZ", - "6": "الناز" - } + "authors": [ + "BMRG14", + "Dalba", + "Ebraminio", + "Reza1615", + "ZxxZxxZ", + "الناز" + ] }, "index.newPad": "دفترچه یادداشت تازه", "index.createOpenPad": "یا ایجاد/بازکردن یک دفترچه یادداشت با نام:", diff --git a/src/locales/fi.json b/src/locales/fi.json index b69833d2..991407cb 100644 --- a/src/locales/fi.json +++ b/src/locales/fi.json @@ -1,15 +1,16 @@ { "@metadata": { - "authors": { - "0": "Artnay", - "1": "Jl", - "2": "Lliehu", - "3": "Nedergard", - "4": "Nike", - "6": "Stryn", - "7": "Veikk0.ma", - "8": "VezonThunder" - } + "authors": [ + "Artnay", + "Jl", + "Lliehu", + "Nedergard", + "Nike", + "Stryn", + "Tomi Toivio", + "Veikk0.ma", + "VezonThunder" + ] }, "index.newPad": "Uusi muistio", "index.createOpenPad": "tai luo tai avaa muistio nimellä:", @@ -19,8 +20,8 @@ "pad.toolbar.strikethrough.title": "Yliviivaus", "pad.toolbar.ol.title": "Numeroitu lista", "pad.toolbar.ul.title": "Numeroimaton lista", - "pad.toolbar.indent.title": "Sisennä", - "pad.toolbar.unindent.title": "Ulonna", + "pad.toolbar.indent.title": "Sisennä (TAB)", + "pad.toolbar.unindent.title": "Ulonna (Shift+TAB)", "pad.toolbar.undo.title": "Kumoa (Ctrl-Z)", "pad.toolbar.redo.title": "Tee uudelleen (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Poista kirjoittajavärit", diff --git a/src/locales/fr.json b/src/locales/fr.json index a61d90b0..20900640 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -1,22 +1,22 @@ { "@metadata": { - "authors": { - "0": "Cquoi", - "1": "Crochet.david", - "2": "Gomoko", - "3": "Goofy", - "4": "Goofy-bz", - "5": "Jean-Frédéric", - "6": "Leviathan", - "7": "McDutchie", - "8": "Metroitendo", - "9": "Od1n", - "10": "Peter17", - "11": "Quenenni", - "12": "Rastus Vernon", - "14": "Stephane Cottin", - "15": "Tux-tn" - } + "authors": [ + "Cquoi", + "Crochet.david", + "Gomoko", + "Goofy", + "Goofy-bz", + "Jean-Frédéric", + "Leviathan", + "McDutchie", + "Metroitendo", + "Od1n", + "Peter17", + "Quenenni", + "Rastus Vernon", + "Stephane Cottin", + "Tux-tn" + ] }, "index.newPad": "Nouveau pad", "index.createOpenPad": "ou créer/ouvrir un pad intitulé :", diff --git a/src/locales/gl.json b/src/locales/gl.json index f728ec0b..3a216e86 100644 --- a/src/locales/gl.json +++ b/src/locales/gl.json @@ -1,8 +1,8 @@ { "@metadata": { - "authors": { - "1": "Toliño" - } + "authors": [ + "Toliño" + ] }, "index.newPad": "Novo documento", "index.createOpenPad": "ou cree/abra un documento co nome:", diff --git a/src/locales/he.json b/src/locales/he.json index 908a2791..41915aac 100644 --- a/src/locales/he.json +++ b/src/locales/he.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "0": "Amire80", - "1": "Ofrahod", - "3": "YaronSh", - "4": "תומר ט" - } + "authors": [ + "Amire80", + "Ofrahod", + "YaronSh", + "תומר ט" + ] }, "index.newPad": "פנקס חדש", "index.createOpenPad": "ליצור או לפתוח פנקס בשם:", diff --git a/src/locales/hu.json b/src/locales/hu.json index 8c01edf0..c3f594ce 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "0": "Dj", - "1": "Misibacsi", - "2": "R-Joe", - "4": "Tgr" - } + "authors": [ + "Dj", + "Misibacsi", + "R-Joe", + "Tgr" + ] }, "index.newPad": "Új notesz", "index.createOpenPad": "vagy notesz létrehozása ezen a néven:", diff --git a/src/locales/it.json b/src/locales/it.json index 8e98a684..087cc0c9 100644 --- a/src/locales/it.json +++ b/src/locales/it.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "0": "Beta16", - "1": "Gianfranco", - "2": "Muxator", - "4": "Vituzzu" - } + "authors": [ + "Beta16", + "Gianfranco", + "Muxator", + "Vituzzu" + ] }, "index.newPad": "Nuovo Pad", "index.createOpenPad": "o creare o aprire un Pad con il nome:", diff --git a/src/locales/ko.json b/src/locales/ko.json index 5e7d4308..459ba376 100644 --- a/src/locales/ko.json +++ b/src/locales/ko.json @@ -1,9 +1,9 @@ { "@metadata": { - "authors": { - "0": "Hym411", - "2": "아라" - } + "authors": [ + "Hym411", + "아라" + ] }, "index.newPad": "새 패드", "index.createOpenPad": "또는 다음 이름으로 패드 만들기/열기:", diff --git a/src/locales/ksh.json b/src/locales/ksh.json index 6bb49dff..49dcb673 100644 --- a/src/locales/ksh.json +++ b/src/locales/ksh.json @@ -1,8 +1,8 @@ { "@metadata": { - "authors": { - "1": "Purodha" - } + "authors": [ + "Purodha" + ] }, "index.newPad": "Neu Padd", "index.createOpenPad": "udder maach e Padd op med däm Naame:", diff --git a/src/locales/lb.json b/src/locales/lb.json index 641e61a0..414fa8c1 100644 --- a/src/locales/lb.json +++ b/src/locales/lb.json @@ -1,9 +1,9 @@ { "@metadata": { - "authors": { - "0": "Robby", - "2": "Soued031" - } + "authors": [ + "Robby", + "Soued031" + ] }, "index.newPad": "Neie Pad", "pad.toolbar.ol.title": "Numeréiert Lëscht", diff --git a/src/locales/ms.json b/src/locales/ms.json index 2d8e9410..1204e47a 100644 --- a/src/locales/ms.json +++ b/src/locales/ms.json @@ -12,8 +12,8 @@ "pad.toolbar.strikethrough.title": "Garis lorek", "pad.toolbar.ol.title": "Senarai tertib", "pad.toolbar.ul.title": "Senarai tak tertib", - "pad.toolbar.indent.title": "Engsot ke dalam", - "pad.toolbar.unindent.title": "Engsot ke luar", + "pad.toolbar.indent.title": "Engsot ke dalam (TAB)", + "pad.toolbar.unindent.title": "Engsot ke luar (Shift + TAB)", "pad.toolbar.undo.title": "Buat asal (Ctrl-Z)", "pad.toolbar.redo.title": "Buat semula (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Padamkan Warna Pengarang", @@ -66,11 +66,15 @@ "pad.modals.initsocketfail.cause": "Ini mungkin disebabkan oleh masalah dengan pelayar atau sambungan internet anda.", "pad.modals.slowcommit.explanation": "Pelayan tidak membalas.", "pad.modals.slowcommit.cause": "Ini mungkin disebabkan oleh masalah dengan kesambungan rangkaian anda.", + "pad.modals.badChangeset.explanation": "Suntingan yang telah anda lakukan telah dikira sebagai terlarang oleh pelayan penyegerakan.", + "pad.modals.badChangeset.cause": "Ini mungkin disebabkan oleh konfigurasi pelayan salah atau sesuatu kelakuan yang tidak dijangka. Sila hubungi penyelia servis anda jika anda merasakan ini adalah satu kesilapan. Cuba sambungkan semula talian untuk terus menyuntung.", + "pad.modals.corruptPad.explanation": "Pad yang anda cuba akses itu telah tercemar.", + "pad.modals.corruptPad.cause": "Ini mungkin disebabkan oleh konfigurasi pelayan salah atau sesuatu kelakuan yang tidak dijangka. Sila hubungi penyelia servis anda.", "pad.modals.deleted": "Dihapuskan.", "pad.modals.deleted.explanation": "Pad ini telah dibuang.", "pad.modals.disconnected": "Sambungan anda telah diputuskan.", "pad.modals.disconnected.explanation": "Sambungan ke pelayan terputus", - "pad.modals.disconnected.cause": "Pelayan mungkin tidak dapat dicapai. Sila beritahu kami jika masalah ini berterusan.", + "pad.modals.disconnected.cause": "Pelayan mungkin tidak dapat dicapai. Sila beritahu penyelia servis jika masalah ini berterusan.", "pad.share": "Kongsikan pad ini", "pad.share.readonly": "Baca sahaja", "pad.share.link": "Pautan", diff --git a/src/locales/ne.json b/src/locales/ne.json new file mode 100644 index 00000000..4ffd69b5 --- /dev/null +++ b/src/locales/ne.json @@ -0,0 +1,86 @@ +{ + "@metadata": { + "authors": [ + "सरोज कुमार ढकाल" + ] + }, + "index.newPad": "नयाँ प्याड", + "index.createOpenPad": "नाम सहितको नयाँ प्याड सिर्जना गर्ने / खोल्ने :", + "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.timeslider.title": "टाइमस्लाइडर", + "pad.toolbar.savedRevision.title": "पुनरावलोकन संग्रहगर्ने", + "pad.toolbar.settings.title": "सेटिङ्गहरू", + "pad.toolbar.embed.title": "यस प्याडलाई बाड्ने या इम्बेड गर्ने", + "pad.toolbar.showusers.title": "यस प्याडमा रहेका प्रयोगकर्ता देखाउने", + "pad.colorpicker.save": "संग्रह गर्ने", + "pad.colorpicker.cancel": "रद्द", + "pad.loading": "लोड हुदैछ...", + "pad.passwordRequired": "यो प्यड खोल्न पासवर्ड चाहिन्छ", + "pad.permissionDenied": "तपाईँलाई यस प्याड खोल्न अनुमति छैन", + "pad.wrongPassword": "तपाईँको पासवर्ड गलत थियो", + "pad.settings.padSettings": "प्याड सेटिङ्गहरू", + "pad.settings.myView": "मेरो दृष्य", + "pad.settings.stickychat": "पर्दामा सधै च्याट गर्ने", + "pad.settings.colorcheck": "लेखकीय रङ्ग", + "pad.settings.linenocheck": "हरफ संख्या", + "pad.settings.rtlcheck": "के सामग्री दाहिने देखि देब्रे पढ्ने हो ?", + "pad.settings.fontType": "फन्ट प्रकार:", + "pad.settings.fontType.normal": "सामान्य", + "pad.settings.fontType.monospaced": "मोनोस्पेस", + "pad.settings.globalView": "विश्वव्यापी दृष्य", + "pad.settings.language": "भाषा:", + "pad.importExport.import_export": "आयात/निर्यात", + "pad.importExport.import": "कुनै पनि पाठ रहेको फाइल या कागजात अपलोड गर्नुहोस्", + "pad.importExport.importSuccessful": "सफल भयो!", + "pad.importExport.export": "निम्न रुपमा प्याड निर्यात गर्ने :", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "साधारण पाठ", + "pad.importExport.exportword": "माइक्रोसफ्ट वर्ड", + "pad.importExport.exportpdf": "पिडिएफ", + "pad.importExport.exportopen": "ओडिएफ(खुल्ला कागजात ढाँचा)", + "pad.importExport.exportdokuwiki": "डकुविकि", + "pad.modals.connected": "जोडीएको।", + "pad.modals.reconnecting": "तपाईँको प्याडमा पुन: जडान गर्दै", + "pad.modals.deleted": "मेटिएको ।", + "pad.modals.deleted.explanation": "यो प्याड हटाइसकेको छ ।", + "pad.modals.disconnected": "तपाईँको जडान अवरुद्ध भयो ।", + "pad.modals.disconnected.explanation": "तपाईँको सर्भरसँगको जडान अवरुद्ध भयो", + "pad.share": "यस प्यडलाई बाड्ने", + "pad.share.readonly": "पढ्ने मात्र", + "pad.share.link": "लिङ्क", + "pad.chat": "कुराकानी", + "pad.chat.title": "यस प्याडको लागि कुराकानी खोल्ने", + "pad.chat.loadmessages": "थप सन्देशहरू खोल्ने", + "timeslider.toolbar.returnbutton": "प्याडमा फर्कनुहोस्", + "timeslider.toolbar.authors": "लेखकहरु:", + "timeslider.toolbar.authorsList": "कुनै पनि लेखकहरू छैनन्", + "timeslider.toolbar.exportlink.title": "निर्यात", + "timeslider.exportCurrent": "हालको संस्करण निम्म रुपमा निर्यात गर्ने :", + "timeslider.version": "संस्करण {{version}}", + "timeslider.saved": "सङ्ग्रह गरिएको {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "जनवरी", + "timeslider.month.february": "फेब्रुअरी", + "timeslider.month.march": "मार्च", + "timeslider.month.april": "एप्रील", + "timeslider.month.may": "मे", + "timeslider.month.june": "जुन", + "timeslider.month.july": "जुलाई", + "timeslider.month.august": "अगस्ट", + "timeslider.month.september": "सेप्टेम्बर", + "timeslider.month.october": "अक्टोबर", + "timeslider.month.november": "नोभेम्बर", + "timeslider.month.december": "डिसेम्बर", + "timeslider.unnamedauthors": "{{num}} unnamed {[plural(num) one: author, other: authors ]}", + "pad.savedrevs.marked": "यस संस्करणलाई संग्रहितको रुपमा चिनो लगाइएको छैन", + "pad.userlist.entername": "तपाईँको नाम लेख्नुहोस्", + "pad.userlist.unnamed": "नाम नखुलाइएको", + "pad.userlist.guest": "पाहुना", + "pad.userlist.deny": "अस्वीकार गर्ने", + "pad.userlist.approve": "स्वीकृत गर्ने" +} \ No newline at end of file diff --git a/src/locales/nn.json b/src/locales/nn.json index 5a98353e..11c24018 100644 --- a/src/locales/nn.json +++ b/src/locales/nn.json @@ -1,8 +1,8 @@ { "@metadata": { - "authors": { - "1": "Unhammer" - } + "authors": [ + "Unhammer" + ] }, "index.newPad": "Ny blokk", "index.createOpenPad": "eller opprett/opna ei blokk med namnet:", diff --git a/src/locales/pl.json b/src/locales/pl.json index 4f4d7a92..6ea8ca42 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "0": "Rezonansowy", - "2": "Ty221", - "3": "WTM", - "4": "Woytecr" - } + "authors": [ + "Rezonansowy", + "Ty221", + "WTM", + "Woytecr" + ] }, "index.newPad": "Nowy dokument", "index.createOpenPad": "lub stwórz/otwórz dokument o nazwie:", @@ -15,8 +15,8 @@ "pad.toolbar.strikethrough.title": "Przekreślenie", "pad.toolbar.ol.title": "Lista uporządkowana", "pad.toolbar.ul.title": "Lista nieuporządkowana", - "pad.toolbar.indent.title": "Wcięcie", - "pad.toolbar.unindent.title": "Zmniejsz wcięcie", + "pad.toolbar.indent.title": "Wcięcie (TAB)", + "pad.toolbar.unindent.title": "Wcięcie (Shift + TAB)", "pad.toolbar.undo.title": "Cofnij (Ctrl-Z)", "pad.toolbar.redo.title": "Ponów (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Usuń kolory autorów", diff --git a/src/locales/pt.json b/src/locales/pt.json index cf32223b..e91ef824 100644 --- a/src/locales/pt.json +++ b/src/locales/pt.json @@ -1,11 +1,11 @@ { "@metadata": { - "authors": { - "0": "Hamilton Abreu", - "1": "Luckas", - "3": "Tuliouel", - "4": "Waldir" - } + "authors": [ + "Hamilton Abreu", + "Luckas", + "Tuliouel", + "Waldir" + ] }, "index.newPad": "Nova Nota", "index.createOpenPad": "ou crie/abra uma Nota com o nome:", diff --git a/src/locales/sv.json b/src/locales/sv.json index e0b9e69a..c4455ff4 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -1,9 +1,9 @@ { "@metadata": { - "authors": { - "0": "Lokal Profil", - "2": "WikiPhoenix" - } + "authors": [ + "Lokal Profil", + "WikiPhoenix" + ] }, "index.newPad": "Nytt block", "index.createOpenPad": "eller skapa/öppna ett block med namnet:", diff --git a/src/locales/te.json b/src/locales/te.json index 2f4372bc..d116afb5 100644 --- a/src/locales/te.json +++ b/src/locales/te.json @@ -1,10 +1,10 @@ { "@metadata": { - "authors": { - "0": "JVRKPRASAD", - "1": "Malkum", - "3": "Veeven" - } + "authors": [ + "JVRKPRASAD", + "Malkum", + "Veeven" + ] }, "index.newPad": "కొత్త పలక", "index.createOpenPad": "ఒక పేరుతో పలకని సృష్టించండి లేదా అదే పేరుతో ఉన్న పలకని తెరవండి", diff --git a/src/locales/tr.json b/src/locales/tr.json index 27f308d6..56c4ad9b 100644 --- a/src/locales/tr.json +++ b/src/locales/tr.json @@ -3,6 +3,7 @@ "authors": [ "Emperyan", "Erdemaslancan", + "Joseph", "Meelo" ] }, @@ -14,8 +15,8 @@ "pad.toolbar.strikethrough.title": "Üstü Çizili", "pad.toolbar.ol.title": "Sıralı liste", "pad.toolbar.ul.title": "Sırasız Liste", - "pad.toolbar.indent.title": "Girintiyi arttır", - "pad.toolbar.unindent.title": "Girintiyi azalt", + "pad.toolbar.indent.title": "Girintiyi arttır (TAB)", + "pad.toolbar.unindent.title": "Girintiyi azalt (Shift+TAB)", "pad.toolbar.undo.title": "Geri Al (Ctrl-Z)", "pad.toolbar.redo.title": "Yenile (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Yazarlık Renklerini Temizle", diff --git a/src/locales/uk.json b/src/locales/uk.json index cddba571..d1cf0b32 100644 --- a/src/locales/uk.json +++ b/src/locales/uk.json @@ -1,12 +1,12 @@ { "@metadata": { - "authors": { - "0": "Andriykopanytsia", - "1": "Base", - "2": "Olvin", - "4": "Steve.rusyn", - "5": "SteveR" - } + "authors": [ + "Andriykopanytsia", + "Base", + "Olvin", + "Steve.rusyn", + "SteveR" + ] }, "index.newPad": "Створити", "index.createOpenPad": "або створити/відкрити документ з назвою:", diff --git a/src/locales/zh-hans.json b/src/locales/zh-hans.json index a463ad9a..642f3be4 100644 --- a/src/locales/zh-hans.json +++ b/src/locales/zh-hans.json @@ -21,8 +21,8 @@ "pad.toolbar.strikethrough.title": "删除线", "pad.toolbar.ol.title": "有序列表", "pad.toolbar.ul.title": "无序列表", - "pad.toolbar.indent.title": "增加缩进", - "pad.toolbar.unindent.title": "减少缩进", + "pad.toolbar.indent.title": "增加缩进(TAB)", + "pad.toolbar.unindent.title": "减少缩进(Shift+TAB)", "pad.toolbar.undo.title": "撤消 (Ctrl-Z)", "pad.toolbar.redo.title": "重做 (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "清除作者颜色", diff --git a/src/locales/zh-hant.json b/src/locales/zh-hant.json index 75431c24..6950226d 100644 --- a/src/locales/zh-hant.json +++ b/src/locales/zh-hant.json @@ -1,12 +1,12 @@ { "@metadata": { - "authors": { - "0": "Justincheng12345", - "1": "Liuxinyu970226", - "2": "Shangkuanlc", - "3": "Shirayuki", - "5": "Simon Shek" - } + "authors": [ + "Justincheng12345", + "Liuxinyu970226", + "Shangkuanlc", + "Shirayuki", + "Simon Shek" + ] }, "index.newPad": "新Pad", "index.createOpenPad": "或創建/開啟以下名稱的pad:", From 5add63165deefd88f55c2667e407fa1874ad658a Mon Sep 17 00:00:00 2001 From: s1341 Date: Mon, 16 Dec 2013 17:32:32 +0200 Subject: [PATCH 106/152] Fix server side bug index overflow The server wasn't properly checking that the changesets it needed to return for changeset_requests actually existed. --- src/node/handler/PadMessageHandler.js | 234 +++++++++++++------------- 1 file changed, 120 insertions(+), 114 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 748b8382..90053b41 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1,6 +1,6 @@ /** - * The MessageHandler handles all Messages that comes from Socket.IO and controls the sessions - */ + * The MessageHandler handles all Messages that comes from Socket.IO and controls the sessions + */ /* * Copyright 2009 Google Inc., 2011 Peter 'Pita' Martischka (Primary Technology Ltd) @@ -106,12 +106,12 @@ exports.kickSessionsFromPad = function(padID) * @param client the client that leaves */ exports.handleDisconnect = function(client) -{ +{ stats.meter('disconnects').mark(); - + //save the padname of this session var session = sessioninfos[client.id]; - + //if this connection was already etablished with a handshake, send a disconnect message to the others if(session && session.author) { @@ -128,7 +128,7 @@ exports.handleDisconnect = function(client) authorManager.getAuthorColorId(session.author, function(err, color) { ERR(err); - + //prepare the notification for the other users on the pad, that this user left var messageToTheOtherUsers = { "type": "COLLABROOM", @@ -142,14 +142,14 @@ exports.handleDisconnect = function(client) } } }; - + //Go trough all user that are still on the pad, and send them the USER_LEAVE message client.broadcast.to(session.padId).json.send(messageToTheOtherUsers); - }); + }); } - + //Delete the sessioninfos entrys of this session - delete sessioninfos[client.id]; + delete sessioninfos[client.id]; } /** @@ -158,7 +158,7 @@ exports.handleDisconnect = function(client) * @param message the message from the client */ exports.handleMessage = function(client, message) -{ +{ if(message == null) { return; @@ -174,7 +174,7 @@ exports.handleMessage = function(client, message) var handleMessageHook = function(callback){ var dropMessage = false; - // Call handleMessage hook. If a plugin returns null, the message will be dropped. Note that for all messages + // Call handleMessage hook. If a plugin returns null, the message will be dropped. Note that for all messages // handleMessage will be called, even if the client is not authorized hooks.aCallAll("handleMessage", { client: client, message: message }, function ( err, messages ) { if(ERR(err, callback)) return; @@ -183,7 +183,7 @@ exports.handleMessage = function(client, message) dropMessage = true; } }); - + // If no plugins explicitly told us to drop the message, its ok to proceed if(!dropMessage){ callback() }; }); @@ -259,7 +259,7 @@ exports.handleMessage = function(client, message) var checkAccessCallback = function(err, statusObject) { if(ERR(err, callback)) return; - + //access was granted if(statusObject.accessStatus == "grant") { @@ -297,17 +297,17 @@ exports.handleMessage = function(client, message) function handleSaveRevisionMessage(client, message){ var padId = sessioninfos[client.id].padId; var userId = sessioninfos[client.id].author; - + padManager.getPad(padId, function(err, pad) { if(ERR(err)) return; - + pad.addSavedRevision(pad.head, userId); }); } /** - * Handles a custom message, different to the function below as it handles objects not strings and you can + * Handles a custom message, different to the function below as it handles objects not strings and you can * direct the message to specific sessionID * * @param msg {Object} the message we're sending @@ -356,10 +356,10 @@ function handleChatMessage(client, message) var userId = sessioninfos[client.id].author; var text = message.data.text; var padId = sessioninfos[client.id].padId; - + var pad; var userName; - + async.series([ //get the pad function(callback) @@ -385,7 +385,7 @@ function handleChatMessage(client, message) { //save the chat message pad.appendChatMessage(text, userId, time); - + var msg = { type: "COLLABROOM", data: { @@ -396,10 +396,10 @@ function handleChatMessage(client, message) text: text } }; - + //broadcast the chat message to everyone on the pad socketio.sockets.in(padId).json.send(msg); - + callback(); } ], function(err) @@ -425,20 +425,20 @@ function handleGetChatMessages(client, message) messageLogger.warn("Dropped message, GetChatMessages Message has no start!"); return; } - + var start = message.data.start; var end = message.data.end; var count = start - count; - + if(count < 0 && count > 100) { messageLogger.warn("Dropped message, GetChatMessages Message, client requested invalid amout of messages!"); return; } - + var padId = sessioninfos[client.id].padId; var pad; - + async.series([ //get the pad function(callback) @@ -488,10 +488,10 @@ function handleSuggestUserName(client, message) messageLogger.warn("Dropped message, suggestUserName Message has no unnamedId!"); return; } - + var padId = sessioninfos[client.id].padId, clients = socketio.sockets.clients(padId); - + //search the author and send him this message for(var i = 0; i < clients.length; i++) { var session = sessioninfos[clients[i].id]; @@ -520,14 +520,14 @@ function handleUserInfoUpdate(client, message) messageLogger.warn("Dropped message, USERINFO_UPDATE Message has no colorId!"); return; } - + //Find out the author name of this session var author = sessioninfos[client.id].author; - + //Tell the authorManager about the new attributes authorManager.setAuthorColorId(author, message.data.userInfo.colorId); authorManager.setAuthorName(author, message.data.userInfo.name); - + var padId = sessioninfos[client.id].padId; var infoMsg = { @@ -545,7 +545,7 @@ function handleUserInfoUpdate(client, message) } } }; - + //Send the other clients on the pad the update message client.broadcast.to(padId).json.send(infoMsg); } @@ -588,7 +588,7 @@ function handleUserChanges(data, cb) messageLogger.warn("Dropped message, USER_CHANGES Message has no changeset!"); return cb(); } - + //get all Vars we need var baseRev = message.data.baseRev; var wireApool = (new AttributePool()).fromJsonable(message.data.apool); @@ -596,12 +596,12 @@ function handleUserChanges(data, cb) // The client might disconnect between our callbacks. We should still // finish processing the changeset, so keep a reference to the session. var thisSession = sessioninfos[client.id]; - + var r, apool, pad; // Measure time to process edit var stopWatch = stats.timer('edits').start(); - + async.series([ //get the pad function(callback) @@ -617,7 +617,7 @@ function handleUserChanges(data, cb) function(callback) { //ex. _checkChangesetAndPool - + try { // Verify that the changeset has valid syntax and is in canonical form @@ -644,9 +644,9 @@ function handleUserChanges(data, cb) if('author' == attr[0] && attr[1] != thisSession.author) throw new Error("Trying to submit changes as another author in changeset "+changeset); }) } - + //ex. adoptChangesetAttribs - + //Afaik, it copies the new attributes from the changeset, to the global Attribute Pool changeset = Changeset.moveOpsToNewPool(changeset, wireApool, pad.pool); } @@ -657,7 +657,7 @@ function handleUserChanges(data, cb) stats.meter('failedChangesets').mark(); return callback(new Error("Can't apply USER_CHANGES, because "+e.message)); } - + //ex. applyUserChanges apool = pad.pool; r = baseRev; @@ -671,7 +671,7 @@ function handleUserChanges(data, cb) function(callback) { r++; - + pad.getRevisionChangeset(r, function(err, c) { if(ERR(err, callback)) return; @@ -704,16 +704,16 @@ function handleUserChanges(data, cb) function (callback) { var prevText = pad.text(); - - if (Changeset.oldLen(changeset) != prevText.length) + + if (Changeset.oldLen(changeset) != prevText.length) { client.json.send({disconnect:"badChangeset"}); stats.meter('failedChangesets').mark(); return callback(new Error("Can't apply USER_CHANGES "+changeset+" with oldLen " + Changeset.oldLen(changeset) + " to document of length " + prevText.length)); } - + pad.appendRevision(changeset, thisSession.author); - + var correctionChangeset = _correctMarkersInPad(pad.atext, pad.pool); if (correctionChangeset) { pad.appendRevision(correctionChangeset); @@ -724,7 +724,7 @@ function handleUserChanges(data, cb) var nlChangeset = Changeset.makeSplice(pad.text(), pad.text().length-1, 0, "\n"); pad.appendRevision(nlChangeset); } - + exports.updatePadClients(pad, function(er) { ERR(er) }); @@ -739,16 +739,16 @@ 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) return callback(); - + // since all clients usually get the same set of changesets, store them in local cache // to remove unnecessary roundtrip to the datalayer // TODO: in REAL world, if we're working without datalayer cache, all requests to revisions will be fired - // BEFORE first result will be landed to our cache object. The solution is to replace parallel processing + // BEFORE first result will be landed to our cache object. The solution is to replace parallel processing // via async.forEach with sequential for() loop. There is no real benefits of running this in parallel, // but benefit of reusing cached revision object is HUGE var revCache = {}; @@ -763,7 +763,7 @@ exports.updatePadClients = function(pad, callback) async.whilst( function (){ return sessioninfos[sid] && sessioninfos[sid].rev < pad.getHeadRevisionNumber()}, function(callback) - { + { var r = sessioninfos[sid].rev + 1; async.waterfall([ @@ -772,7 +772,7 @@ exports.updatePadClients = function(pad, callback) callback(null, revCache[r]); else pad.getRevision(r, callback); - }, + }, function(revision, callback) { revCache[r] = revision; @@ -800,8 +800,8 @@ exports.updatePadClients = function(pad, callback) author: author, currentTime: currentTime, timeDelta: currentTime - sessioninfos[sid].time - }}; - + }}; + client.json.send(wireMsg); } @@ -814,7 +814,7 @@ exports.updatePadClients = function(pad, callback) }, callback ); - },callback); + },callback); } /** @@ -830,11 +830,11 @@ function _correctMarkersInPad(atext, apool) { var offset = 0; while (iter.hasNext()) { var op = iter.next(); - + var hasMarker = _.find(AttributeManager.lineAttributes, function(attribute){ return Changeset.opAttributeValue(op, attribute, apool); }) !== undefined; - + if (hasMarker) { for(var i=0;i 0 && text.charAt(offset-1) != '\n') { @@ -864,7 +864,7 @@ function _correctMarkersInPad(atext, apool) { } /** - * Handles a CLIENT_READY. A CLIENT_READY is the first message from the client to the server. The Client sends his token + * Handles a CLIENT_READY. A CLIENT_READY is the first message from the client to the server. The Client sends his token * and the pad it wants to enter. The Server answers with the inital values (clientVars) of the pad * @param client the client that send this message * @param message the message from the client @@ -922,7 +922,7 @@ function handleClientReady(client, message) securityManager.checkAccess (padIds.padId, message.sessionID, message.token, message.password, function(err, statusObject) { if(ERR(err, callback)) return; - + //access was granted if(statusObject.accessStatus == "grant") { @@ -935,7 +935,7 @@ function handleClientReady(client, message) client.json.send({accessStatus: statusObject.accessStatus}) } }); - }, + }, //get all authordata of this new user, and load the pad-object from the database function(callback) { @@ -967,7 +967,7 @@ function handleClientReady(client, message) function(callback) { var authors = pad.getAllAuthors(); - + async.parallel([ //get timestamp of latest revission needed for timeslider function(callback) @@ -993,7 +993,7 @@ function handleClientReady(client, message) }, callback); } ], callback); - + }, //glue the clientVars together, send them and tell the other clients that a new one is there function(callback) @@ -1013,12 +1013,12 @@ 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; sessioninfos[client.id].readOnlyPadId = padIds.readOnlyPadId; 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 @@ -1056,7 +1056,7 @@ function handleClientReady(client, message) client.json.send({disconnect:"corruptPad"});// pull the breaks return callback(); } - + // Warning: never ever send padIds.padId to the client. If the // client is read only you would open a security hole 1 swedish // mile wide... @@ -1085,7 +1085,7 @@ function handleClientReady(client, message) "padId": message.padId, "initialTitle": "Pad: " + message.padId, "opts": {}, - // tell the client the number of the latest chat-message, which will be + // 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, @@ -1093,7 +1093,7 @@ function handleClientReady(client, message) "readonly": padIds.readonly, "serverTimestamp": new Date().getTime(), "userId": author, - "abiwordAvailable": settings.abiwordAvailable(), + "abiwordAvailable": settings.abiwordAvailable(), "plugins": { "plugins": plugins.plugins, "parts": plugins.parts, @@ -1106,18 +1106,18 @@ function handleClientReady(client, message) { clientVars.userName = authorName; } - + //call the clientVars-hook so plugins can modify them before they get sent to the client hooks.aCallAll("clientVars", { clientVars: clientVars, pad: pad }, function ( err, messages ) { if(ERR(err, callback)) return; - + _.each(messages, function(newVars) { //combine our old object with the new attributes from the hook for(var attr in newVars) { clientVars[attr] = newVars[attr]; } }); - + //Join the pad and start receiving updates client.join(padIds.padId); //Send the clientVars to the Client @@ -1126,9 +1126,9 @@ function handleClientReady(client, message) sessioninfos[client.id].rev = pad.getHeadRevisionNumber(); }); } - + sessioninfos[client.id].author = author; - + //prepare the notification for the other users on the pad, that this user joined var messageToTheOtherUsers = { "type": "COLLABROOM", @@ -1142,7 +1142,7 @@ function handleClientReady(client, message) } } }; - + //Add the authorname of this new User, if avaiable if(authorName != null) { @@ -1151,7 +1151,7 @@ function handleClientReady(client, message) // notify all existing users about new user 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) { @@ -1160,9 +1160,9 @@ function handleClientReady(client, message) //Jump over, if this session is the connection session if(roomClient.id == client.id) return callback(); - - - //Since sessioninfos might change while being enumerated, check if the + + + //Since sessioninfos might change while being enumerated, check if the //sessionID is still assigned to a valid session if(sessioninfos[roomClient.id] !== undefined) author = sessioninfos[roomClient.id].author; @@ -1178,7 +1178,7 @@ function handleClientReady(client, message) callback(null, historicalAuthorData[author]); else authorManager.getAuthor(author, callback); - }, + }, function (authorInfo, callback) { //Send the new User a Notification about this other user @@ -1207,7 +1207,7 @@ function handleClientReady(client, message) } /** - * Handles a request for a rough changeset, the timeslider client needs it + * Handles a request for a rough changeset, the timeslider client needs it */ function handleChangesetRequest(client, message) { @@ -1237,7 +1237,7 @@ function handleChangesetRequest(client, message) messageLogger.warn("Dropped message, changeset request has no requestID!"); return; } - + var granularity = message.data.granularity; var start = message.data.start; var end = start + (100 * granularity); @@ -1281,47 +1281,49 @@ function getChangesetInfo(padId, startNum, endNum, granularity, callback) var composedChangesets = {}; var revisionDate = []; var lines; - + var head_revision = 0; + async.series([ //get the pad from the database function(callback) { padManager.getPad(padId, function(err, _pad) - { + { if(ERR(err, callback)) return; pad = _pad; + head_revision = pad.getHeadRevisionNumber(); callback(); }); }, function(callback) - { + { //calculate the last full endnum var lastRev = pad.getHeadRevisionNumber(); if (endNum > lastRev+1) { endNum = lastRev+1; } endNum = Math.floor(endNum / granularity)*granularity; - + var compositesChangesetNeeded = []; var revTimesNeeded = []; - + //figure out which composite Changeset and revTimes we need, to load them in bulk var compositeStart = startNum; - while (compositeStart < endNum) + while (compositeStart < endNum) { var compositeEnd = compositeStart + granularity; - + //add the composite Changeset we needed compositesChangesetNeeded.push({start: compositeStart, end: compositeEnd}); - + //add the t1 time we need revTimesNeeded.push(compositeStart == 0 ? 0 : compositeStart - 1); //add the t2 time we need revTimesNeeded.push(compositeEnd - 1); - + compositeStart += granularity; } - + //get all needed db values parallel async.parallel([ function(callback) @@ -1358,58 +1360,57 @@ function getChangesetInfo(padId, startNum, endNum, granularity, callback) if(ERR(err, callback)) return; lines = _lines; callback(); - }); + }); } ], callback); }, //doesn't know what happens here excatly :/ function(callback) - { + { var compositeStart = startNum; - - while (compositeStart < endNum) + + while (compositeStart < endNum) { - if (compositeStart + granularity > endNum) + var compositeEnd = compositeStart + granularity; + if (compositeEnd > endNum || compositeEnd > head_revision) { break; } - - var compositeEnd = compositeStart + granularity; - + var forwards = composedChangesets[compositeStart + "/" + compositeEnd]; var backwards = Changeset.inverse(forwards, lines.textlines, lines.alines, pad.apool()); - + Changeset.mutateAttributionLines(forwards, lines.alines, pad.apool()); Changeset.mutateTextLines(forwards, lines.textlines); - + var forwards2 = Changeset.moveOpsToNewPool(forwards, pad.apool(), apool); var backwards2 = Changeset.moveOpsToNewPool(backwards, pad.apool(), apool); - + var t1, t2; - if (compositeStart == 0) + if (compositeStart == 0) { t1 = revisionDate[0]; } - else + else { t1 = revisionDate[compositeStart - 1]; } - + t2 = revisionDate[compositeEnd - 1]; - + timeDeltas.push(t2 - t1); forwardsChangesets.push(forwards2); backwardsChangesets.push(backwards2); - + compositeStart += granularity; } - + callback(); } ], function(err) { if(ERR(err, callback)) return; - + callback(null, {forwardsChangesets: forwardsChangesets, backwardsChangesets: backwardsChangesets, apool: apool.toJsonable(), @@ -1424,7 +1425,7 @@ function getChangesetInfo(padId, startNum, endNum, granularity, callback) * Tries to rebuild the getPadLines function of the original Etherpad * https://github.com/ether/pad/blob/master/etherpad/src/etherpad/control/pad/pad_changeset_control.js#L263 */ -function getPadLines(padId, revNum, callback) +function getPadLines(padId, revNum, callback) { var atext; var result = {}; @@ -1435,7 +1436,7 @@ function getPadLines(padId, revNum, callback) function(callback) { padManager.getPad(padId, function(err, _pad) - { + { if(ERR(err, callback)) return; pad = _pad; callback(); @@ -1479,7 +1480,7 @@ function getPadLines(padId, revNum, callback) function composePadChangesets(padId, startNum, endNum, callback) { var pad; - var changesets = []; + var changesets = {}; var changeset; async.series([ @@ -1497,14 +1498,19 @@ function composePadChangesets(padId, startNum, endNum, callback) function(callback) { var changesetsNeeded=[]; - - //create a array for all changesets, we will + + var headNum = pad.getHeadRevisionNumber(); + if (endNum > headNum) + endNum = headNum; + if (startNum < 0) + startNum = 0; + //create a array for all changesets, we will //replace the values with the changeset later for(var r=startNum;r Date: Tue, 17 Dec 2013 16:20:57 +0100 Subject: [PATCH 107/152] Don't crash if CHANGESET_REQ fails --- src/node/db/Pad.js | 6 +++++- src/node/handler/PadMessageHandler.js | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index 180517d1..4f0f268b 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -203,7 +203,11 @@ Pad.prototype.getInternalRevisionAText = function getInternalRevisionAText(targe { curRev++; var cs = changesets[curRev]; - atext = Changeset.applyToAText(cs, atext, apool); + try{ + atext = Changeset.applyToAText(cs, atext, apool); + }catch(e) { + return callback(e) + } } callback(null); diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 90053b41..774ebf08 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1255,7 +1255,7 @@ function handleChangesetRequest(client, message) //build the requested rough changesets and send them back getChangesetInfo(padIds.padId, start, end, granularity, function(err, changesetInfo) { - ERR(err); + if(err) return console.error('Error while handling a changeset request for '+padIds.padId, err, message.data); var data = changesetInfo; data.requestID = message.data.requestID; From 8313083cd9813614241d72036a49eddfb2ddfb3f Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 17 Dec 2013 20:48:19 +0000 Subject: [PATCH 108/152] better handling for attribute queries --- src/static/js/ace2_inner.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 0aa9998a..b68b020c 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -2334,7 +2334,10 @@ function Ace2Inner(){ return false; // If we're at the end of a line we treat it as having no formatting } if(rep.selStart[1] == 0 && rep.selEnd[1] == 0){ - return false; // If we're at the start of a line attributes get confused.. + rep.selEnd[1] == 1; + } + if(rep.selEnd[1] == -1){ + rep.selEnd[1] = 1; // sometimes rep.selEnd is -1, not sure why.. When it is we should look at the first char } if (n == selStartLine) { From 1a138438ebff98e3b93f0f1a9e8ded69735bee34 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 18 Dec 2013 18:34:35 +0000 Subject: [PATCH 109/152] dont error when pressing del on rep 0 0 --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index b68b020c..0866f682 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -1668,7 +1668,7 @@ function Ace2Inner(){ { //var id = n.uniqueId(); // parent of n may not be "root" in IE due to non-tree-shaped DOM (wtf) - n.parentNode.removeChild(n); + if(n.parentNode) n.parentNode.removeChild(n); //dmesg(htmlPrettyEscape(htmlForRemovedChild(n))); //console.log("removed: "+id); From 333d2f119b4c19777f3b709f0548b25c03e2ba56 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 18 Dec 2013 22:13:03 +0000 Subject: [PATCH 110/152] expose update browser selection function --- src/static/js/ace2_inner.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 0866f682..6c4d9b4f 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3954,6 +3954,7 @@ function Ace2Inner(){ selection.focusAtStart = !! rep.selFocusAtStart; setSelection(selection); } + editorInfo.ace_updateBrowserSelectionFromRep = updateBrowserSelectionFromRep; function nodeMaxIndex(nd) { From 44f817da01c81b9da08485026276e80b48011200 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 23 Dec 2013 20:11:18 +0000 Subject: [PATCH 111/152] Localisation updates from https://translatewiki.net. --- src/locales/lrc.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/locales/lrc.json b/src/locales/lrc.json index 663b3f74..55fe0989 100644 --- a/src/locales/lrc.json +++ b/src/locales/lrc.json @@ -4,6 +4,7 @@ "Mogoeilor" ] }, + "pad.toolbar.bold.title": "توپر", "pad.toolbar.italic.title": "کج کوله(ctrl-l)", "pad.toolbar.underline.title": "زیر خط دار بین (Ctrl-U)", "pad.toolbar.ol.title": "نوم گه منظم", @@ -56,5 +57,6 @@ "pad.userlist.unnamed": "نوم نهشته", "pad.userlist.guest": "میزوان", "pad.userlist.deny": "پرو کردن", - "pad.userlist.approve": "اصلا کردن" + "pad.userlist.approve": "اصلا کردن", + "pad.impexp.importing": "د حالت وارد کردن" } \ No newline at end of file From 1e0456c7ed883a6cfa9947daca9dd2eb45c2ef30 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 28 Dec 2013 17:43:47 +0000 Subject: [PATCH 112/152] Localisation updates from https://translatewiki.net. --- src/locales/lrc.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/locales/lrc.json b/src/locales/lrc.json index 55fe0989..73263af1 100644 --- a/src/locales/lrc.json +++ b/src/locales/lrc.json @@ -17,7 +17,10 @@ "pad.colorpicker.save": "ذخيره كردن", "pad.colorpicker.cancel": "رد كردن", "pad.loading": "د حالت سوار كرد", + "pad.wrongPassword": "پاسوردتو اشتوائه", "pad.settings.myView": "نظرگه مه", + "pad.settings.stickychat": "همیشه د بلگه چک چنه بکید", + "pad.settings.linenocheck": "شماره خطیا", "pad.settings.fontType": "نوع فونت:", "pad.settings.fontType.normal": "عادی", "pad.settings.fontType.monospaced": "تک جاگه", @@ -58,5 +61,7 @@ "pad.userlist.guest": "میزوان", "pad.userlist.deny": "پرو کردن", "pad.userlist.approve": "اصلا کردن", - "pad.impexp.importing": "د حالت وارد کردن" + "pad.impexp.importbutton": "ایسه وارد کو", + "pad.impexp.importing": "د حالت وارد کردن", + "pad.impexp.copypaste": "خواهشن وردار بدیسن" } \ No newline at end of file From 9c64b6e268f89ecca22bf6a135da1152daf77455 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Mon, 30 Dec 2013 13:06:13 +0100 Subject: [PATCH 113/152] Try to find related languages as a fallback fixes #2029 --- src/static/js/html10n.js | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/static/js/html10n.js b/src/static/js/html10n.js index 856729b5..49a0a80d 100644 --- a/src/static/js/html10n.js +++ b/src/static/js/html10n.js @@ -191,9 +191,18 @@ window.html10n = (function(window, document, undefined) { return } + // dat alng ain't here, man! if (!data[lang]) { - cb(new Error('Couldn\'t find translations for '+lang)) - return + var msg = 'Couldn\'t find translations for '+lang + , l + if(~lang.indexOf('-')) lang = lang.split('-')[0] // then let's try related langs + for(l in data) { + if(lang != l && l.indexOf(lang) === 0 && data[l]) { + lang = l + break; + } + } + if(lang != l) return cb(new Error(msg)) } if ('string' == typeof data[lang]) { @@ -898,11 +907,22 @@ window.html10n = (function(window, document, undefined) { var lang langs.reverse() - // loop through priority array... + // loop through the priority array... for (var i=0, n=langs.length; i < n; i++) { lang = langs[i] - if(!lang || !(lang in that.loader.langs)) continue; + if(!lang) continue; + if(!(lang in that.loader.langs)) {// uh, we don't have this lang availbable.. + // then check for related langs + if(~lang.indexOf('-')) lang = lang.split('-')[0]; + for(var l in that.loader.langs) { + if(lang != l && l.indexOf(lang) === 0) { + lang = l + break; + } + } + if(lang != l) continue; + } // ... and apply all strings of the current lang in the list // to our build object From a35254c772bd9e040ccdbadf6effc50f47887749 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Mon, 6 Jan 2014 11:01:26 +0000 Subject: [PATCH 114/152] Localisation updates from https://translatewiki.net. --- src/locales/diq.json | 10 +++++----- src/locales/km.json | 7 +++++-- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/locales/diq.json b/src/locales/diq.json index 5d7794b4..691c7b71 100644 --- a/src/locales/diq.json +++ b/src/locales/diq.json @@ -67,15 +67,15 @@ "timeslider.month.january": "Çele", "timeslider.month.february": "Zemherı", "timeslider.month.march": "Mert", - "timeslider.month.april": "Lisan", + "timeslider.month.april": "Nisane", "timeslider.month.may": "Gúlan", "timeslider.month.june": "Heziran", "timeslider.month.july": "Temuz", - "timeslider.month.august": "Ağustos", + "timeslider.month.august": "Tebaxe", "timeslider.month.september": "Keşkelun", - "timeslider.month.october": "Cetan", - "timeslider.month.november": "Kelverdan", - "timeslider.month.december": "Gağand", + "timeslider.month.october": "Tışrino Verên", + "timeslider.month.november": "Tışrino Peyên", + "timeslider.month.december": "Kanun", "timeslider.unnamedauthors": "{{num}} unnamed {[plural(num) zu: nuştoğ, zewbi: nustoği ]}", "pad.userlist.entername": "Namey ğo cı kewe", "pad.userlist.unnamed": "Name nébıyo", diff --git a/src/locales/km.json b/src/locales/km.json index 700ae199..4d997f54 100644 --- a/src/locales/km.json +++ b/src/locales/km.json @@ -12,17 +12,20 @@ "pad.toolbar.strikethrough.title": "ឆូតចោល", "pad.toolbar.ol.title": "បញ្ជីតាមតម្រៀប", "pad.toolbar.ul.title": "បញ្ជីមិនតាមតម្រៀប", - "pad.toolbar.indent.title": "ខិតចូលក្នុង", - "pad.toolbar.unindent.title": "ខិតចេញក្រៅ", + "pad.toolbar.indent.title": "ខិតចូលក្នុង (TAB)", + "pad.toolbar.unindent.title": "ខិតចេញក្រៅ (Shift+TAB)", "pad.toolbar.undo.title": "អាន់ឌូ (Ctrl-Z)", "pad.toolbar.redo.title": "រីឌូ (Ctrl-Y)", "pad.toolbar.import_export.title": "នាំចូល/នាំចេញ ពី/ទៅប្រភេទឯកសារផ្សេងទៀត", + "pad.toolbar.savedRevision.title": "រក្សាទុកកំណែ", "pad.toolbar.settings.title": "ការកំណត់​", "pad.colorpicker.save": "រក្សាទុក", "pad.colorpicker.cancel": "បោះបង់", "pad.loading": "កំពុងផ្ទុក…", + "pad.settings.myView": "គំហើញរបស់ខ្ញុំ", "pad.settings.fontType": "ប្រភេទពុម្ពអក្សរ៖", "pad.settings.fontType.normal": "ធម្មតា", + "pad.settings.globalView": "គំហើញសកល", "pad.settings.language": "ភាសា៖", "pad.importExport.import_export": "នាំចូល/នាំចេញ", "pad.importExport.importSuccessful": "ដោយជោគជ័យ!", From 2f9a9d8695e7c028e596083a7ba8a5dbeaf85b4c Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 11 Jan 2014 16:47:39 +0000 Subject: [PATCH 115/152] Localisation updates from https://translatewiki.net. --- src/locales/el.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/locales/el.json b/src/locales/el.json index df6d1b11..c76e74be 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -63,17 +63,18 @@ "pad.modals.userdup.advice": "Επανασύνδεση για να χρησιμοποιήσετε αυτό το παράθυρο.", "pad.modals.unauth": "Δεν επιτρέπεται", "pad.modals.unauth.explanation": "Τα δικαιώματά σας άλλαξαν όσο βλέπατε αυτήν τη σελίδα. Δοκιμάστε να επανασυνδεθείτε.", - "pad.modals.looping.explanation": "Υπάρχουν προβλήματα επικοινωνίας με το διακομιστή συγχρονισμού.", + "pad.modals.looping.explanation": "Υπάρχουν προβλήματα επικοινωνίας με τον διακομιστή συγχρονισμού.", "pad.modals.looping.cause": "Ίσως συνδεθήκατε μέσω ενός μη συμβατού τείχους προστασίας ή διακομιστή μεσολάβησης.", "pad.modals.initsocketfail": "Αδύνατη ή επικοινωνία με τον διακομιστή.", "pad.modals.initsocketfail.explanation": "Δεν ήταν δυνατή η σύνδεση με τον διακομιστή συγχρονισμού.", "pad.modals.initsocketfail.cause": "Αυτό οφείλεται πιθανώς σε πρόβλημα με το πρόγραμμα περιήγησης ή της σύνδεσής σας στο διαδίκτυο.", "pad.modals.slowcommit.explanation": "Ο διακομιστής δεν αποκρίνεται.", "pad.modals.slowcommit.cause": "Αυτό μπορεί να οφείλεται σε προβλήματα σύνδεσης δικτύου.", + "pad.modals.badChangeset.explanation": "Μια επεξεργασία που κάνατε χαρακτηρίστηκε ως παράνομη από τον διακομιστή συγχρονισμού.", "pad.modals.deleted": "Διεγράφη.", "pad.modals.deleted.explanation": "Αυτό το pad έχει καταργηθεί.", "pad.modals.disconnected": "Έχετε αποσυνδεθεί.", - "pad.modals.disconnected.explanation": "Χάθηκε η σύνδεση με το διακομιστή", + "pad.modals.disconnected.explanation": "Χάθηκε η σύνδεση με τον διακομιστή", "pad.modals.disconnected.cause": "Ο διακομιστής μπορεί να μην είναι διαθέσιμος. Παρακαλούμε ειδοποιήστε τον διαχειριστή της υπηρεσίας εάν εξακολουθεί να συμβαίνει αυτό.", "pad.share": "Μοιραστείτε αυτό το pad", "pad.share.readonly": "Μόνο για ανάγνωση", From 9ef709e7f7145ca4eece6b08f7d5f6fc937acd07 Mon Sep 17 00:00:00 2001 From: Robert Helmer Date: Wed, 15 Jan 2014 10:58:50 -0800 Subject: [PATCH 116/152] mozilla bug 844796 - use node crypto module for randomString --- src/node/utils/randomstring.js | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/node/utils/randomstring.js b/src/node/utils/randomstring.js index 4c1bba24..4791f274 100644 --- a/src/node/utils/randomstring.js +++ b/src/node/utils/randomstring.js @@ -1,16 +1,13 @@ /** * Generates a random String with the given length. Is needed to generate the Author, Group, readonly, session Ids */ +var crypto = require('crypto'); + var randomString = function randomString(len) { - var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - var randomstring = ''; - for (var i = 0; i < len; i++) - { - var rnum = Math.floor(Math.random() * chars.length); - randomstring += chars.substring(rnum, rnum + 1); - } - return randomstring; + crypto.randomBytes(48, function(ex, buf) { + return buf.toString('hex'); + }); }; module.exports = randomString; From ae99c5ea6fbd9f051951d0f05d664ebf629f941c Mon Sep 17 00:00:00 2001 From: Robert Helmer Date: Wed, 15 Jan 2014 11:25:33 -0800 Subject: [PATCH 117/152] new randomString function should take len arg --- src/node/utils/randomstring.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node/utils/randomstring.js b/src/node/utils/randomstring.js index 4791f274..78846157 100644 --- a/src/node/utils/randomstring.js +++ b/src/node/utils/randomstring.js @@ -5,7 +5,7 @@ var crypto = require('crypto'); var randomString = function randomString(len) { - crypto.randomBytes(48, function(ex, buf) { + crypto.randomBytes(len, function(ex, buf) { return buf.toString('hex'); }); }; From 348d9a838f16450e6180822cf7c702ad1508523b Mon Sep 17 00:00:00 2001 From: Robert Helmer Date: Wed, 15 Jan 2014 11:25:47 -0800 Subject: [PATCH 118/152] convert over to server-side crypto --- src/node/db/Pad.js | 1 - src/node/db/ReadOnlyManager.js | 2 +- src/node/db/SecurityManager.js | 1 - src/node/db/SessionManager.js | 2 +- src/node/handler/APIHandler.js | 2 +- src/node/utils/Settings.js | 2 +- 6 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/node/db/Pad.js b/src/node/db/Pad.js index 4f0f268b..c7e0d50a 100644 --- a/src/node/db/Pad.js +++ b/src/node/db/Pad.js @@ -6,7 +6,6 @@ var ERR = require("async-stacktrace"); var Changeset = require("ep_etherpad-lite/static/js/Changeset"); var AttributePool = require("ep_etherpad-lite/static/js/AttributePool"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; var db = require("./DB").db; var async = require("async"); var settings = require('../utils/Settings'); diff --git a/src/node/db/ReadOnlyManager.js b/src/node/db/ReadOnlyManager.js index dd1e478e..f49f71e2 100644 --- a/src/node/db/ReadOnlyManager.js +++ b/src/node/db/ReadOnlyManager.js @@ -22,7 +22,7 @@ var ERR = require("async-stacktrace"); var db = require("./DB").db; var async = require("async"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("../utils/randomstring"); /** * returns a read only id for a pad diff --git a/src/node/db/SecurityManager.js b/src/node/db/SecurityManager.js index 66cfd292..6388f096 100644 --- a/src/node/db/SecurityManager.js +++ b/src/node/db/SecurityManager.js @@ -26,7 +26,6 @@ var authorManager = require("./AuthorManager"); var padManager = require("./PadManager"); var sessionManager = require("./SessionManager"); var settings = require("../utils/Settings"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; var log4js = require('log4js'); var authLogger = log4js.getLogger("auth"); diff --git a/src/node/db/SessionManager.js b/src/node/db/SessionManager.js index 60e0a7ac..b6ff1ce9 100644 --- a/src/node/db/SessionManager.js +++ b/src/node/db/SessionManager.js @@ -21,7 +21,7 @@ var ERR = require("async-stacktrace"); var customError = require("../utils/customError"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("../utils/randomstring"); var db = require("./DB").db; var async = require("async"); var groupMangager = require("./GroupManager"); diff --git a/src/node/handler/APIHandler.js b/src/node/handler/APIHandler.js index 7206eb87..62025c50 100644 --- a/src/node/handler/APIHandler.js +++ b/src/node/handler/APIHandler.js @@ -23,7 +23,7 @@ var ERR = require("async-stacktrace"); var fs = require("fs"); var api = require("../db/API"); var padManager = require("../db/PadManager"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("../utils/randomstring"); //ensure we have an apikey var apikey = null; diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index ee696b03..bc13a211 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -26,7 +26,7 @@ var argv = require('./Cli').argv; var npm = require("npm/lib/npm.js"); var jsonminify = require("jsonminify"); var log4js = require("log4js"); -var randomString = require('ep_etherpad-lite/static/js/pad_utils').randomString; +var randomString = require("./randomstring"); /* Root path of the installation */ From 3715535f863b44fc6438fb4a9ead1c1fd3a627f7 Mon Sep 17 00:00:00 2001 From: Gared Date: Sun, 19 Jan 2014 19:23:11 +0100 Subject: [PATCH 119/152] Fix #2058 Add square brackets to url characters --- src/static/js/linestylefilter.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/linestylefilter.js b/src/static/js/linestylefilter.js index 034822a4..cb1ee1d5 100644 --- a/src/static/js/linestylefilter.js +++ b/src/static/js/linestylefilter.js @@ -259,7 +259,7 @@ linestylefilter.getRegexpFilter = function(regExp, tag) linestylefilter.REGEX_WORDCHAR = /[\u0030-\u0039\u0041-\u005A\u0061-\u007A\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF\u0100-\u1FFF\u3040-\u9FFF\uF900-\uFDFF\uFE70-\uFEFE\uFF10-\uFF19\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFDC]/; -linestylefilter.REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/\\?=&#!;()$]/.source + '|' + linestylefilter.REGEX_WORDCHAR.source + ')'); +linestylefilter.REGEX_URLCHAR = new RegExp('(' + /[-:@a-zA-Z0-9_.,~%+\/\\?=&#!;()\[\]$]/.source + '|' + linestylefilter.REGEX_WORDCHAR.source + ')'); linestylefilter.REGEX_URL = new RegExp(/(?:(?:https?|s?ftp|ftps|file|nfs):\/\/|mailto:|www\.)/.source + linestylefilter.REGEX_URLCHAR.source + '*(?![:.,;])' + linestylefilter.REGEX_URLCHAR.source, 'g'); linestylefilter.getURLFilter = linestylefilter.getRegexpFilter( linestylefilter.REGEX_URL, 'url'); From bf6ec18ead5f06af3c11501bfb26e708e5250a2a Mon Sep 17 00:00:00 2001 From: Gared Date: Sun, 19 Jan 2014 20:04:09 +0100 Subject: [PATCH 120/152] Fix #1835 Enable import buttons after failed import (timeout) --- src/static/js/pad_impexp.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/js/pad_impexp.js b/src/static/js/pad_impexp.js index ae951ca7..aa48ad77 100644 --- a/src/static/js/pad_impexp.js +++ b/src/static/js/pad_impexp.js @@ -77,6 +77,7 @@ var padimpexp = (function() } currentImportTimer = null; importFailed("Request timed out."); + importDone(); }, 25000); // time out after some number of seconds $('#importsubmitinput').attr( { From a43123880a16d7186f3183b409ff22b62706dcc6 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Fri, 24 Jan 2014 01:19:14 +0100 Subject: [PATCH 121/152] fix randomstring --- src/node/utils/randomstring.js | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/node/utils/randomstring.js b/src/node/utils/randomstring.js index 78846157..3815c66d 100644 --- a/src/node/utils/randomstring.js +++ b/src/node/utils/randomstring.js @@ -3,11 +3,9 @@ */ var crypto = require('crypto'); -var randomString = function randomString(len) +var randomString = function(len) { - crypto.randomBytes(len, function(ex, buf) { - return buf.toString('hex'); - }); + return crypto.randomBytes(len).toString('hex') }; module.exports = randomString; From 728958e131e541f56764111bf8b3c7f7e87a9d59 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Fri, 24 Jan 2014 19:51:24 +0000 Subject: [PATCH 122/152] Localisation updates from https://translatewiki.net. --- src/locales/el.json | 1 + src/locales/et.json | 76 +++++++++++++++++++++++++++++++++++++++++++++ src/locales/km.json | 8 ++++- src/locales/mk.json | 6 ++-- 4 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/locales/et.json diff --git a/src/locales/el.json b/src/locales/el.json index c76e74be..d203fc74 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -71,6 +71,7 @@ "pad.modals.slowcommit.explanation": "Ο διακομιστής δεν αποκρίνεται.", "pad.modals.slowcommit.cause": "Αυτό μπορεί να οφείλεται σε προβλήματα σύνδεσης δικτύου.", "pad.modals.badChangeset.explanation": "Μια επεξεργασία που κάνατε χαρακτηρίστηκε ως παράνομη από τον διακομιστή συγχρονισμού.", + "pad.modals.corruptPad.explanation": "Το pad που προσπαθείτε να επισκεφτείτε είναι κατεστραμμένο.", "pad.modals.deleted": "Διεγράφη.", "pad.modals.deleted.explanation": "Αυτό το pad έχει καταργηθεί.", "pad.modals.disconnected": "Έχετε αποσυνδεθεί.", diff --git a/src/locales/et.json b/src/locales/et.json new file mode 100644 index 00000000..5ab5f883 --- /dev/null +++ b/src/locales/et.json @@ -0,0 +1,76 @@ +{ + "@metadata": { + "authors": [ + "Kristian.kankainen" + ] + }, + "index.newPad": "Uus klade", + "index.createOpenPad": "loo või rööptoimeta kladet nimega:", + "pad.toolbar.bold.title": "Rasvane (Ctrl + B)", + "pad.toolbar.italic.title": "Kaldkiri (Ctrl + I)", + "pad.toolbar.underline.title": "Allakriipsutus (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Läbikriipsutus", + "pad.toolbar.ol.title": "Nummerdatud loend", + "pad.toolbar.ul.title": "Täppidega loend", + "pad.toolbar.indent.title": "Suurenda taanet (TAB)", + "pad.toolbar.unindent.title": "Vähenda taanet (Shift+TAB)", + "pad.toolbar.undo.title": "Võta tagasi (Ctrl-Z)", + "pad.toolbar.redo.title": "Tee uuesti (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Kustuta eri autorite värvid", + "pad.toolbar.import_export.title": "Impordi-ekspordi eri failivormingutesse", + "pad.toolbar.timeslider.title": "Ajajoon", + "pad.toolbar.savedRevision.title": "Salvesta revisjon", + "pad.toolbar.settings.title": "Seaded", + "pad.toolbar.embed.title": "Jaga ja põimi seda kladet", + "pad.toolbar.showusers.title": "Näita klade kasutajaid", + "pad.colorpicker.save": "Salvesta", + "pad.colorpicker.cancel": "Loobu", + "pad.loading": "Laadimine...", + "pad.passwordRequired": "Sul peab olema parool selle klade rööptoimetamiseks", + "pad.permissionDenied": "Sul puuduvad ligipääsuõigused selle klade rööptoimetamiseks", + "pad.wrongPassword": "Vigane parool", + "pad.settings.padSettings": "Klade seadistused", + "pad.settings.myView": "Minu vaade", + "pad.settings.stickychat": "Näita vestlust alatiselt ekraanil", + "pad.settings.colorcheck": "Autorite värvid", + "pad.settings.linenocheck": "Reanumbrid", + "pad.settings.rtlcheck": "Näita sisu paremalt vasakule?", + "pad.settings.fontType": "Šrifti tüüp:", + "pad.settings.fontType.normal": "Normaalne", + "pad.settings.fontType.monospaced": "Ühelaiuste märkidega", + "pad.settings.globalView": "Koguvaade", + "pad.settings.language": "Keel:", + "pad.importExport.import_export": "Import-eksport", + "pad.importExport.import": "Laadi üles mistahes tekstifail või dokument", + "pad.importExport.importSuccessful": "Edukalt laaditud!", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Lihttekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Paraku on ainult lihttekstis voi HTML-vormingus dokumentide importimine võimaldatud. Rohkem võimaluste jaoks peab \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Epaigaldama abiword\u003C/a\u003E.", + "pad.modals.connected": "Ühendatud.", + "pad.modals.reconnecting": "Proovitakse luua ühendus klade juurde...", + "pad.modals.forcereconnect": "Sunni ühenduse taasloomist", + "pad.modals.userdup": "Käesolev klade on avatud teises aknas", + "pad.modals.userdup.explanation": "Käesolev klade paistab olevat avatud rohkem kui ühes brauseriaknas selles arvutis.", + "pad.modals.userdup.advice": "Kasuta käesolevat akent teiste asemel.", + "pad.modals.unauth": "Pole lubatud", + "pad.modals.unauth.explanation": "Sinu ligipääsuõigused on muutunud. Proovi ühendada uuesti.", + "pad.modals.looping.explanation": "Serveriga sünkroniseerimine tundub olevat takistatud.", + "pad.modals.looping.cause": "Äkki oled ühendatud tulemüüri või puhverserveri kaudu?", + "pad.modals.initsocketfail": "Server pole kättesaadaval.", + "pad.modals.initsocketfail.cause": "See on tõenäoliselt su brauserist või internetiühendusest tingitud.", + "pad.modals.slowcommit.explanation": "Server ei vasta.", + "pad.modals.slowcommit.cause": "See on tõenäoliselt võrguühendusest tingitud.", + "timeslider.month.january": "Jaanuar", + "timeslider.unnamedauthors": "{{num}} nimetamata {[plural(num) one: autor, other: autorit ]}", + "pad.savedrevs.marked": "Revisjon märgiti salvestatuna", + "pad.userlist.entername": "Sisesta oma nimi", + "pad.userlist.unnamed": "Nimetu", + "pad.userlist.guest": "Külaline", + "pad.userlist.deny": "Eira", + "pad.userlist.approve": "Nõustu", + "pad.editbar.clearcolors": "Kas soovid kustutada autorite värvid dokumendist?" +} \ No newline at end of file diff --git a/src/locales/km.json b/src/locales/km.json index 4d997f54..2e4a3847 100644 --- a/src/locales/km.json +++ b/src/locales/km.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": [ - "វ័ណថារិទ្ធ" + "វ័ណថារិទ្ធ", + "Sovichet" ] }, "index.newPad": "ផេតថ្មី", @@ -36,6 +37,7 @@ "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", "pad.modals.connected": "បាន​តភ្ជាប់​។", + "pad.modals.deleted": "បាន​លុប។", "pad.share.link": "តំណ​ភ្ជាប់", "timeslider.month.january": "មករា", "timeslider.month.february": "កុម្ភៈ", @@ -49,7 +51,11 @@ "timeslider.month.october": "តុលា", "timeslider.month.november": "វិច្ឆិកា", "timeslider.month.december": "ធ្នូ", + "pad.userlist.entername": "បញ្ចូល​ឈ្មោះ​របស់​អ្នក", + "pad.userlist.unnamed": "គ្មាន​ឈ្មោះ", "pad.userlist.guest": "ភ្ញៀវ", + "pad.userlist.deny": "បដិសេធ", + "pad.userlist.approve": "យល់​ព្រម", "pad.impexp.importbutton": "នាំចូលឥឡូវនេះ", "pad.impexp.importing": "កំពុងនាំចូល​..." } \ No newline at end of file diff --git a/src/locales/mk.json b/src/locales/mk.json index 0894b47a..dd741307 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -13,8 +13,8 @@ "pad.toolbar.strikethrough.title": "Прецртано", "pad.toolbar.ol.title": "Подреден список", "pad.toolbar.ul.title": "Неподреден список", - "pad.toolbar.indent.title": "Вовлекување", - "pad.toolbar.unindent.title": "Отстап", + "pad.toolbar.indent.title": "Вовлекување (TAB)", + "pad.toolbar.unindent.title": "Отстап (Shift+TAB)", "pad.toolbar.undo.title": "Врати (Ctrl-Z)", "pad.toolbar.redo.title": "Повтори (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Поништи ги авторските бои", @@ -51,7 +51,7 @@ "pad.importExport.exportpdf": "PDF", "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", - "pad.importExport.abiword.innerHTML": "Можете да увезувате само од прост текст и html-формат. Понапредни можности за увоз ќе добиете ако \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eинсталирате AbiWord\u003C/a\u003E.", + "pad.importExport.abiword.innerHTML": "Можете да увезувате само од прост текст и HTML-формат. Понапредни можности за увоз ќе добиете ако \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Eвоспоставите AbiWord\u003C/a\u003E.", "pad.modals.connected": "Поврзано.", "pad.modals.reconnecting": "Ве преповрзувам со тетратката...", "pad.modals.forcereconnect": "Наметни преповрзување", From 3f31445abfd3a168f2e32e1e64c5a5d7fc03b2e4 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Tue, 28 Jan 2014 14:07:26 +0100 Subject: [PATCH 123/152] don't call ace_getInInternationalComposition if editor is not fully loaded --- src/static/js/ace.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/static/js/ace.js b/src/static/js/ace.js index d2bbb484..addc412f 100644 --- a/src/static/js/ace.js +++ b/src/static/js/ace.js @@ -124,6 +124,7 @@ function Ace2Editor() editor.getInInternationalComposition = function() { + if (!loaded) return false; return info.ace_getInInternationalComposition(); }; From 7151e7827a52497ae4f8f08ae805d961b57ec4aa Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 1 Feb 2014 07:05:25 +0000 Subject: [PATCH 124/152] allow tabs to be cycled when focus is in editor --- src/static/js/ace2_inner.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/ace2_inner.js b/src/static/js/ace2_inner.js index 6c4d9b4f..07a9b971 100644 --- a/src/static/js/ace2_inner.js +++ b/src/static/js/ace2_inner.js @@ -3750,7 +3750,7 @@ function Ace2Inner(){ specialHandled = true; } if((evt.which == 36 && evt.ctrlKey == true)){ setScrollY(0); } // Control Home send to Y = 0 - if((evt.which == 33 || evt.which == 34) && type == 'keydown'){ + if((evt.which == 33 || evt.which == 34) && type == 'keydown' && !evt.ctrlKey){ evt.preventDefault(); // This is required, browsers will try to do normal default behavior on page up / down and the default behavior SUCKS From 65a3344f460b71da1ffa1505941e0addbac75137 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 2 Feb 2014 12:36:23 +0000 Subject: [PATCH 125/152] Localisation updates from https://translatewiki.net. --- src/locales/be-tarask.json | 5 +++-- src/locales/br.json | 6 +++++- src/locales/el.json | 8 ++++---- src/locales/sl.json | 4 ++++ 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/locales/be-tarask.json b/src/locales/be-tarask.json index af4b5c89..2f7ea3ca 100644 --- a/src/locales/be-tarask.json +++ b/src/locales/be-tarask.json @@ -2,7 +2,8 @@ "@metadata": { "authors": [ "Jim-by", - "Wizardist" + "Wizardist", + "Red Winged Duck" ] }, "index.newPad": "Стварыць", @@ -13,7 +14,7 @@ "pad.toolbar.strikethrough.title": "Закрэсьліваньне", "pad.toolbar.ol.title": "Упарадкаваны сьпіс", "pad.toolbar.ul.title": "Неўпарадкаваны сьпіс", - "pad.toolbar.indent.title": "Водступ", + "pad.toolbar.indent.title": "Водступ (TAB)", "pad.toolbar.unindent.title": "Выступ", "pad.toolbar.undo.title": "Скасаваць(Ctrl-Z)", "pad.toolbar.redo.title": "Вярнуць (Ctrl-Y)", diff --git a/src/locales/br.json b/src/locales/br.json index d28f8248..ebfa006b 100644 --- a/src/locales/br.json +++ b/src/locales/br.json @@ -16,7 +16,7 @@ "pad.toolbar.ol.title": "Roll urzhiet", "pad.toolbar.ul.title": "Roll en dizurzh", "pad.toolbar.indent.title": "Endantañ (TAB)", - "pad.toolbar.unindent.title": "Diendantañ", + "pad.toolbar.unindent.title": "Diendantañ (Shift+TAB)", "pad.toolbar.undo.title": "Dizober (Ktrl-Z)", "pad.toolbar.redo.title": "Adober (Ktrl-Y)", "pad.toolbar.clearAuthorship.title": "Diverkañ al livioù oc'h anaout an aozerien", @@ -69,6 +69,10 @@ "pad.modals.initsocketfail.cause": "Gallout a ra ar gudenn dont eus ho merdeer Web pe eus ho kevreadur Internet.", "pad.modals.slowcommit.explanation": "Ne respont ket ar serveur.", "pad.modals.slowcommit.cause": "Gallout a ra dont diwar kudennoù kevreañ gant ar rouedad.", + "pad.modals.badChangeset.explanation": "Graet ho peus ur c'hemm met rummet eo bet evel e-maez lezenn gant ar servijer sinkronelaat", + "pad.modals.badChangeset.cause": "Dont a ra marteze eus ur c'hefluniadur fall eus ar servijer pe eus un emzalc'h dic'hortoz all. Kit e darempred, mar plij, gant merour ar servijer, ma soñj deoc'h ez eo ur fazi. Klaskit kevreañ en-dro evit kenderc'hel da gemmañ.", + "pad.modals.corruptPad.explanation": "Breinet eo ar bloc'h emaoc'h o klask tizhout.", + "pad.modals.corruptPad.cause": "Dont a ra marteze eus ur c'hefluniadur fall eus ar servijer pe eus un emzalc'h dic'hortoz all. Kit e darempred, mar plij, gant merour ar servijer.", "pad.modals.deleted": "Dilamet.", "pad.modals.deleted.explanation": "Lamet eo bet ar pad-mañ.", "pad.modals.disconnected": "Digevreet oc'h bet.", diff --git a/src/locales/el.json b/src/locales/el.json index d203fc74..8696c08b 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -20,7 +20,7 @@ "pad.toolbar.unindent.title": "Αφαίρεση εσοχής (Shift+TAB)", "pad.toolbar.undo.title": "Αναίρεση (Ctrl-Z)", "pad.toolbar.redo.title": "Επανάληψη (Ctrl-Y)", - "pad.toolbar.clearAuthorship.title": "Καθαρισμός Χρωμάτων Συντακτών", + "pad.toolbar.clearAuthorship.title": "Εκκαθάριση των χρωμάτων των συντακτών", "pad.toolbar.import_export.title": "Εισαγωγή/Εξαγωγή από/σε διαφορετικούς τύπους αρχείων", "pad.toolbar.timeslider.title": "Χρονοδιάγραμμα", "pad.toolbar.savedRevision.title": "Αποθήκευση Αναθεώρησης", @@ -35,10 +35,10 @@ "pad.wrongPassword": "Ο κωδικός σας ήταν λανθασμένος", "pad.settings.padSettings": "Ρυθμίσεις Pad", "pad.settings.myView": "Η προβολή μου", - "pad.settings.stickychat": "Η Συνομιλία να είναι πάντα ορατή", + "pad.settings.stickychat": "Να είναι πάντα ορατή η συνομιλία", "pad.settings.colorcheck": "Χρώματα συντάκτη", - "pad.settings.linenocheck": "Αριθμοί γραμμής", - "pad.settings.rtlcheck": "Θέλετε να διαβάσετε το περιεχόμενο από δεξιά προς τα αριστερά;", + "pad.settings.linenocheck": "Αριθμοί γραμμών", + "pad.settings.rtlcheck": "Να διαβάζεται το περιεχόμενο από δεξιά προς τα αριστερά;", "pad.settings.fontType": "Τύπος γραμματοσειράς:", "pad.settings.fontType.normal": "Κανονική", "pad.settings.fontType.monospaced": "Καθορισμένου πλάτους", diff --git a/src/locales/sl.json b/src/locales/sl.json index 1b83f422..05f6537d 100644 --- a/src/locales/sl.json +++ b/src/locales/sl.json @@ -67,6 +67,10 @@ "pad.modals.initsocketfail.cause": "Najverjetneje je težava v brskalniku, ali pa so težave z internetno povezavo.", "pad.modals.slowcommit.explanation": "Strežnik se ne odziva.", "pad.modals.slowcommit.cause": "Najverjetneje je prišlo do napake med vzpostavitvijo povezave.", + "pad.modals.badChangeset.explanation": "Urejanje, ki ste ga naredili, je sinhronizacijski strežnik označil kot nelegalno.", + "pad.modals.badChangeset.cause": "Razlog za to je morda napačna konfiguracija strežnika ali neko drugo nepričakovano vedenje. Prosimo, stopite v stik z upravljavcem storitve, če menite, da gre za napako. Poskusite se ponovno povezati, da nadaljujete z urejanjem.", + "pad.modals.corruptPad.explanation": "Blok, do katerega želite dostopati, je poškodovan.", + "pad.modals.corruptPad.cause": "Razlog za to je morda napačna konfiguracija strežnika ali neko drugo nepričakovano vedenje. Prosimo, stopite v stik z upravljavcem storitve.", "pad.modals.deleted": "Izbrisano.", "pad.modals.deleted.explanation": "Dokument je odstranjen.", "pad.modals.disconnected": "Povezava je prekinjena.", From f798e287fb80a82d0110a1b670d6383ee0c2584b Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 9 Feb 2014 15:22:15 +0000 Subject: [PATCH 126/152] Localisation updates from https://translatewiki.net. --- src/locales/et.json | 52 ++++++++++++++++++++++++++++++++++++++++++--- src/locales/sk.json | 9 ++++---- 2 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/locales/et.json b/src/locales/et.json index 5ab5f883..421486b8 100644 --- a/src/locales/et.json +++ b/src/locales/et.json @@ -19,7 +19,7 @@ "pad.toolbar.clearAuthorship.title": "Kustuta eri autorite värvid", "pad.toolbar.import_export.title": "Impordi-ekspordi eri failivormingutesse", "pad.toolbar.timeslider.title": "Ajajoon", - "pad.toolbar.savedRevision.title": "Salvesta revisjon", + "pad.toolbar.savedRevision.title": "Salvesta versioon", "pad.toolbar.settings.title": "Seaded", "pad.toolbar.embed.title": "Jaga ja põimi seda kladet", "pad.toolbar.showusers.title": "Näita klade kasutajaid", @@ -43,6 +43,7 @@ "pad.importExport.import_export": "Import-eksport", "pad.importExport.import": "Laadi üles mistahes tekstifail või dokument", "pad.importExport.importSuccessful": "Edukalt laaditud!", + "pad.importExport.export": "Ekspordi käesolev klade kui:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Lihttekst", "pad.importExport.exportword": "Microsoft Word", @@ -61,16 +62,61 @@ "pad.modals.looping.explanation": "Serveriga sünkroniseerimine tundub olevat takistatud.", "pad.modals.looping.cause": "Äkki oled ühendatud tulemüüri või puhverserveri kaudu?", "pad.modals.initsocketfail": "Server pole kättesaadaval.", + "pad.modals.initsocketfail.explanation": "Ei saadud ühendust sünkroniseerimisserveriga.", "pad.modals.initsocketfail.cause": "See on tõenäoliselt su brauserist või internetiühendusest tingitud.", "pad.modals.slowcommit.explanation": "Server ei vasta.", "pad.modals.slowcommit.cause": "See on tõenäoliselt võrguühendusest tingitud.", + "pad.modals.badChangeset.explanation": "Sünkroniseerimisserver keeldus vastuvõtmast tehtud muudatuse.", + "pad.modals.badChangeset.cause": "See võib sõltuda serveri valest seadistusest või mõnest muust tõrkest. Palun kontakteeru teenuse haldajaga või proovi uuesti.", + "pad.modals.corruptPad.explanation": "Klade, millele püüad ligi pääseda, on rikkis.", + "pad.modals.corruptPad.cause": "See võib sõltuda serveri valest seadistusest või mõnest muust tõrkest. Palun kontakteeru teenuse haldajaga või proovi uuesti.", + "pad.modals.deleted": "Kustutatud.", + "pad.modals.deleted.explanation": "Klade on kustutatud.", + "pad.modals.disconnected": "Sa ei ole ühendatud.", + "pad.modals.disconnected.explanation": "Ühendus serveriga katkes", + "pad.modals.disconnected.cause": "Server ei ole saadaval. Palun kontakteeru teenuse haldajaga või proovi uuesti.", + "pad.share": "Jaga kladet", + "pad.share.readonly": "Kirjutuskaitstud", + "pad.share.link": "Link", + "pad.share.emebdcode": "Põimi URL", + "pad.chat": "Vestle", + "pad.chat.title": "Ava klade vestlusaken.", + "pad.chat.loadmessages": "Laadi rohkem sõnumeid", + "timeslider.pageTitle": "{{appTitle}} ajajoon", + "timeslider.toolbar.returnbutton": "Tagasi kladele", + "timeslider.toolbar.authors": "Autoridː", + "timeslider.toolbar.authorsList": "Autor puudub", + "timeslider.toolbar.exportlink.title": "Eksport", + "timeslider.exportCurrent": "Ekspordi käesolev versioon kuiː", + "timeslider.version": "Versioon {{version}}", + "timeslider.saved": "Salvestatud {{day}}. {{month}}il {{year}}. aastal", + "timeslider.dateformat": "{{day}}.{{month}}.{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Jaanuar", + "timeslider.month.february": "Veebruar", + "timeslider.month.march": "Märts", + "timeslider.month.april": "Aprill", + "timeslider.month.may": "Mai", + "timeslider.month.june": "Juuni", + "timeslider.month.july": "Juuli", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "Oktoober", + "timeslider.month.november": "November", + "timeslider.month.december": "Detsember", "timeslider.unnamedauthors": "{{num}} nimetamata {[plural(num) one: autor, other: autorit ]}", - "pad.savedrevs.marked": "Revisjon märgiti salvestatuna", + "pad.savedrevs.marked": "Versioon märgiti salvestatuna", "pad.userlist.entername": "Sisesta oma nimi", "pad.userlist.unnamed": "Nimetu", "pad.userlist.guest": "Külaline", "pad.userlist.deny": "Eira", "pad.userlist.approve": "Nõustu", - "pad.editbar.clearcolors": "Kas soovid kustutada autorite värvid dokumendist?" + "pad.editbar.clearcolors": "Kas soovid kustutada autorite värvid dokumendist?", + "pad.impexp.importbutton": "Impordi", + "pad.impexp.importing": "Importimine...", + "pad.impexp.confirmimport": "Faili importimine kustutab praeguse versiooni. Kas kindlasti importida?", + "pad.impexp.convertFailed": "Antud faili pole võimalik importida. Palun kasuta teist vormingut või kopeeri-kleebi käsitsi", + "pad.impexp.uploadFailed": "Üleslaadimine nurjus, proovi uuesti", + "pad.impexp.importfailed": "Importimine nurjus", + "pad.impexp.copypaste": "Palun kopeeri ja kleebi", + "pad.impexp.exportdisabled": "Eksportimine vormingusse {{type}} on hetkel keelatud. Üksikasjade saamiseks pöördu oma süsteemiadministraatori poole." } \ No newline at end of file diff --git a/src/locales/sk.json b/src/locales/sk.json index 15eef02c..8c8759e6 100644 --- a/src/locales/sk.json +++ b/src/locales/sk.json @@ -1,7 +1,8 @@ { "@metadata": { "authors": [ - "Teslaton" + "Teslaton", + "Kusavica" ] }, "index.newPad": "Nový Pad", @@ -12,8 +13,8 @@ "pad.toolbar.strikethrough.title": "Prečiarknuté", "pad.toolbar.ol.title": "Číslovaný zoznam", "pad.toolbar.ul.title": "Odrážkový zoznam", - "pad.toolbar.indent.title": "Zväčšiť odsadenie", - "pad.toolbar.unindent.title": "Zmenšiť odsadenie", + "pad.toolbar.indent.title": "Zväčšiť odsadenie (TAB)", + "pad.toolbar.unindent.title": "Zmenšiť odsadenie (Shift+TAB)", "pad.toolbar.undo.title": "Späť (Ctrl-Z)", "pad.toolbar.redo.title": "Znova (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Odstrániť farby autorstva", @@ -70,7 +71,7 @@ "pad.modals.deleted.explanation": "Tento Pad bol odstránený.", "pad.modals.disconnected": "Boli ste odpojení.", "pad.modals.disconnected.explanation": "Spojenie so serverom sa prerušilo", - "pad.modals.disconnected.cause": "Server môže byť nedostupný. Ak by problém pretrvával, informujte nás prosím.", + "pad.modals.disconnected.cause": "Server môže byť nedostupný. Ak by problém pretrvával, informujte správcu služby.", "pad.share": "Zdieľať tento Pad", "pad.share.readonly": "Len na čítanie", "pad.share.link": "Odkaz", From 44062ae76593c889e6e9bfe3ca55bb3c16f2d58b Mon Sep 17 00:00:00 2001 From: Benjamin Chodoroff Date: Mon, 17 Feb 2014 11:40:30 -0500 Subject: [PATCH 127/152] escape rendered npm package info --- src/static/js/admin/plugins.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/admin/plugins.js b/src/static/js/admin/plugins.js index 885c028d..e6c7a122 100644 --- a/src/static/js/admin/plugins.js +++ b/src/static/js/admin/plugins.js @@ -81,7 +81,7 @@ $(document).ready(function () { if(attr == "name"){ // Hack to rewrite URLS into name row.find(".name").html(""+plugin['name'].substr(3)+""); // remove 'ep_' }else{ - row.find("." + attr).html(plugin[attr]); + row.find("." + attr).text(plugin[attr]); } } row.find(".version").html( plugin.version ); From cfdd57b48754ac34819c05150e1677aa2c7613ff Mon Sep 17 00:00:00 2001 From: Simon Gaeremynck Date: Wed, 19 Feb 2014 10:48:15 +0000 Subject: [PATCH 128/152] Addressed a potential never finishing forEach in PadMessageHandler.padUsers If the session info for a client would be null or undefined, the forEach callback would never get called which means the padUsers callback would never get trigged. This could potentially block API request as this function is exposed at an HTTP API endpoint. --- src/node/handler/PadMessageHandler.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 774ebf08..ed47109d 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1570,6 +1570,8 @@ exports.padUsers = function (padID, callback) { result.push(author); callback(); }); + } else { + callback(); } }, function(err) { if(ERR(err, callback)) return; From 0e6019344ea484433e40fe0225bcc10199269ef8 Mon Sep 17 00:00:00 2001 From: Dmitry Uvarov Date: Thu, 20 Feb 2014 14:08:49 +0400 Subject: [PATCH 129/152] fix for infinite loop on bad changeset --- src/static/js/Changeset.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/Changeset.js b/src/static/js/Changeset.js index e47b3052..355bef4a 100644 --- a/src/static/js/Changeset.js +++ b/src/static/js/Changeset.js @@ -1867,7 +1867,7 @@ exports.inverse = function (cs, lines, alines, pool) { curLineOpIterLine = curLine; var indexIntoLine = 0; var done = false; - while (!done) { + while (!done && curLineOpIter.hasNext()) { curLineOpIter.next(curLineNextOp); if (indexIntoLine + curLineNextOp.chars >= curChar) { curLineNextOp.chars -= (curChar - indexIntoLine); From c8c2866087bcac8ce93a571afbd8c2fa5d22a8de Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Thu, 20 Feb 2014 16:33:42 +0100 Subject: [PATCH 130/152] fix crash if disconnect happens for sessions that have messages queued --- src/node/handler/PadMessageHandler.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 774ebf08..75271021 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -588,6 +588,14 @@ function handleUserChanges(data, cb) messageLogger.warn("Dropped message, USER_CHANGES Message has no changeset!"); return cb(); } + //TODO: this might happen with other messages too => find one place to copy the session + //and always use the copy. atm a message will be ignored if the session is gone even + //if the session was valid when the message arrived in the first place + if(!sessioninfos[client.id]) + { + messageLogger.warn("Dropped message, disconnect happened in the mean time"); + return cb(); + } //get all Vars we need var baseRev = message.data.baseRev; From fa681d43f7c10f4ac22a2c394e26aa09f9792a57 Mon Sep 17 00:00:00 2001 From: webzwo0i Date: Thu, 20 Feb 2014 17:38:25 +0100 Subject: [PATCH 131/152] remember user session because it can be gone when finalHandler is called --- src/node/handler/PadMessageHandler.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index 75271021..1399c5d2 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -167,7 +167,8 @@ exports.handleMessage = function(client, message) { return; } - if(!sessioninfos[client.id]) { + var thisSession = sessioninfos[client.id] + if(!thisSession) { messageLogger.warn("Dropped message from an unknown connection.") return; } @@ -196,7 +197,7 @@ exports.handleMessage = function(client, message) } else if(message.type == "CHANGESET_REQ") { handleChangesetRequest(client, message); } else if(message.type == "COLLABROOM") { - if (sessioninfos[client.id].readonly) { + if (thisSession.readonly) { messageLogger.warn("Dropped message, COLLABROOM for readonly pad"); } else if (message.data.type == "USER_CHANGES") { stats.counter('pendingEdits').inc() From eb32835ea12854b86f0e3a957c18c34332e1fc7c Mon Sep 17 00:00:00 2001 From: vvision Date: Mon, 24 Feb 2014 13:29:21 +0100 Subject: [PATCH 132/152] Updated npm version. --- src/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/package.json b/src/package.json index 0c59cfbb..1953ecf1 100644 --- a/src/package.json +++ b/src/package.json @@ -27,7 +27,7 @@ "nodemailer" : "0.3.x", "jsdom-nocontextifiy" : "0.2.10", "async-stacktrace" : "0.0.2", - "npm" : "1.2.x", + "npm" : "1.4.x", "ejs" : "0.6.1", "graceful-fs" : "1.1.5", "slide" : "1.1.3", From c3d62c5fa444b899a7699fefdebe01cf95a7f64c Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Mar 2014 23:14:15 +0000 Subject: [PATCH 133/152] preprocessor for domline attributes --- src/static/js/domline.js | 50 +++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/src/static/js/domline.js b/src/static/js/domline.js index 69508507..a7aaea0d 100644 --- a/src/static/js/domline.js +++ b/src/static/js/domline.js @@ -101,6 +101,17 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { var listType = /(?:^| )list:(\S+)/.exec(cls); var start = /(?:^| )start:(\S+)/.exec(cls); + + _.map(hooks.callAll("aceDomLinePreProcessLineAttributes", { + domline: domline, + cls: cls + }), function(modifier) + { + preHtml += modifier.preHtml; + postHtml += modifier.postHtml; + processedMarker |= modifier.processedMarker; + }); + if (listType) { listType = listType[1]; @@ -108,8 +119,13 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { if(listType.indexOf("number") < 0) { - preHtml = '
    • '; - postHtml = '
    '; + if(!preHtml){ + preHtml = '
    • '; + postHtml = '
    '; + }else{ + preHtml += '
    • '; + postHtml = '
    ' + postHtml; + } } else { @@ -117,16 +133,27 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) if(start[1] == 1){ // if its the first one at this level? lineClass = lineClass + " " + "list-start-" + listType; // Add start class to DIV node } - preHtml = '
    1. '; + if(!preHtml){ + preHtml = '
      1. '; + }else{ + preHtml += '
        1. '; + } }else{ - preHtml = '
          1. '; // Handles pasted contents into existing lists + if(!preHtml){ + preHtml = '
            1. '; // Handles pasted contents into existing lists + }else{ + preHtml += '
              1. '; // Handles pasted contents into existing lists + } + } + if(!postHtml){ + postHtml = '
              '; + }else{ + postHtml = '
            '; } - postHtml = '
          '; } } processedMarker = true; } - _.map(hooks.callAll("aceDomLineProcessLineAttributes", { domline: domline, cls: cls @@ -136,13 +163,10 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) postHtml += modifier.postHtml; processedMarker |= modifier.processedMarker; }); - if( processedMarker ){ result.lineMarker += txt.length; return; // don't append any text } - - } var href = null; var simpleTags = null; @@ -234,10 +258,9 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) result.node.innerHTML = curHTML; } if (lineClass !== null) result.node.className = lineClass; - - hooks.callAll("acePostWriteDomLineHTML", { - node: result.node - }); + hooks.callAll("acePostWriteDomLineHTML", { + node: result.node + }); } result.prepareForAdd = writeHTML; result.finishUpdate = writeHTML; @@ -245,7 +268,6 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { return curHTML || ''; }; - return result; }; From 432438a40d29eab906a23909ee0294dc9016d1f2 Mon Sep 17 00:00:00 2001 From: John McLear Date: Tue, 4 Mar 2014 23:36:16 +0000 Subject: [PATCH 134/152] fix dintenation --- src/static/js/domline.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/static/js/domline.js b/src/static/js/domline.js index a7aaea0d..21b6ff33 100644 --- a/src/static/js/domline.js +++ b/src/static/js/domline.js @@ -260,7 +260,7 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) if (lineClass !== null) result.node.className = lineClass; hooks.callAll("acePostWriteDomLineHTML", { node: result.node - }); + }); } result.prepareForAdd = writeHTML; result.finishUpdate = writeHTML; From df205a4ef47554aae97f24c1f08084f50ad5156e Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 5 Mar 2014 21:44:22 +0000 Subject: [PATCH 135/152] docs --- doc/api/hooks_client-side.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/api/hooks_client-side.md b/doc/api/hooks_client-side.md index c0a4227a..b8a58b31 100644 --- a/doc/api/hooks_client-side.md +++ b/doc/api/hooks_client-side.md @@ -10,6 +10,22 @@ nothing This hook proxies the functionality of jQuery's `$(document).ready` event. +## aceDomLinePreProcessLineAttributes +Called from: src/static/js/domline.js + +Things in context: + +1. domline - The current DOM line being processed +2. cls - The class of the current block element (useful for styling) + +This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. This hook is run BEFORE the numbered and ordered lists logic is applied. + +The return value of this hook should have the following structure: + +`{ preHtml: String, postHtml: String, processedMarker: Boolean }` + +The preHtml and postHtml values will be added to the HTML display of the element, and if processedMarker is true, the engine won't try to process it any more. + ## aceDomLineProcessLineAttributes Called from: src/static/js/domline.js @@ -18,7 +34,7 @@ Things in context: 1. domline - The current DOM line being processed 2. cls - The class of the current block element (useful for styling) -This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. +This hook is called for elements in the DOM that have the "lineMarkerAttribute" set. You can add elements into this category with the aceRegisterBlockElements hook above. This hook is run AFTER the ordered and numbered lists logic is applied. The return value of this hook should have the following structure: From f5716a3b2600a34623901952d825dfeaa1621691 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 5 Mar 2014 21:44:32 +0000 Subject: [PATCH 136/152] cleaner logic --- src/static/js/domline.js | 27 +++++---------------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/src/static/js/domline.js b/src/static/js/domline.js index 8756a285..b1927b16 100644 --- a/src/static/js/domline.js +++ b/src/static/js/domline.js @@ -119,13 +119,8 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) { if(listType.indexOf("number") < 0) { - if(!preHtml){ - preHtml = '
          • '; - postHtml = '
          '; - }else{ - preHtml += '
          • '; - postHtml = '
          ' + postHtml; - } + preHtml += '
          • '; + postHtml = '
          ' + postHtml; } else { @@ -133,23 +128,11 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument) if(start[1] == 1){ // if its the first one at this level? lineClass = lineClass + " " + "list-start-" + listType; // Add start class to DIV node } - if(!preHtml){ - preHtml = '
          1. '; - }else{ - preHtml += '
            1. '; - } + preHtml += '
              1. '; }else{ - if(!preHtml){ - preHtml = '
                1. '; // Handles pasted contents into existing lists - }else{ - preHtml += '
                  1. '; // Handles pasted contents into existing lists - } - } - if(!postHtml){ - postHtml = '
                  '; - }else{ - postHtml = '
                '; + preHtml += '
                1. '; // Handles pasted contents into existing lists } + postHtml += '
                '; } } processedMarker = true; From 96d06abac07af299307d7f993a79abfc7f2b7b92 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Wed, 12 Mar 2014 12:42:31 +0000 Subject: [PATCH 137/152] Localisation updates from https://translatewiki.net. --- src/locales/diq.json | 4 +- src/locales/dsb.json | 122 +++++++++++++++++++++++++++++++++++++++++++ src/locales/el.json | 2 + src/locales/fa.json | 8 +-- src/locales/hsb.json | 122 +++++++++++++++++++++++++++++++++++++++++++ src/locales/hu.json | 4 +- src/locales/km.json | 41 ++++++++++++++- src/locales/mk.json | 2 +- src/locales/ml.json | 2 +- src/locales/ps.json | 5 +- src/locales/pt.json | 46 +++++++++++++--- src/locales/sco.json | 122 +++++++++++++++++++++++++++++++++++++++++++ src/locales/sk.json | 4 +- src/locales/te.json | 24 ++++++++- 14 files changed, 486 insertions(+), 22 deletions(-) create mode 100644 src/locales/dsb.json create mode 100644 src/locales/hsb.json create mode 100644 src/locales/sco.json diff --git a/src/locales/diq.json b/src/locales/diq.json index 691c7b71..bdb8e0ef 100644 --- a/src/locales/diq.json +++ b/src/locales/diq.json @@ -13,8 +13,8 @@ "pad.toolbar.strikethrough.title": "Serxetın", "pad.toolbar.ol.title": "Lista rêzkerdiye", "pad.toolbar.ul.title": "Lista rêznêkerdiye", - "pad.toolbar.indent.title": "Serê rêze", - "pad.toolbar.unindent.title": "Vıcente", + "pad.toolbar.indent.title": "Serrêze (TAB)", + "pad.toolbar.unindent.title": "Teberdayış (Shift+TAB)", "pad.toolbar.undo.title": "Meke (Ctrl-Z)", "pad.toolbar.redo.title": "Fına bıke (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Rengê Nuştoğiê Arıstey", diff --git a/src/locales/dsb.json b/src/locales/dsb.json new file mode 100644 index 00000000..a3ec4799 --- /dev/null +++ b/src/locales/dsb.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "index.newPad": "Nowy zapisnik", + "index.createOpenPad": "abo napóraj/wócyń zapisnik z mjenim:", + "pad.toolbar.bold.title": "Tucny (Strg-B)", + "pad.toolbar.italic.title": "Kursiwny (Strg-I)", + "pad.toolbar.underline.title": "Pódšmarnuś (Strg-U)", + "pad.toolbar.strikethrough.title": "Pśešmarnuś", + "pad.toolbar.ol.title": "Numerěrowana lisćina", + "pad.toolbar.ul.title": "Nalicenje", + "pad.toolbar.indent.title": "Zasunuś (TAB)", + "pad.toolbar.unindent.title": "Wusunuś (Umsch+TAB)", + "pad.toolbar.undo.title": "Anulěrowaś (Strg-Z)", + "pad.toolbar.redo.title": "Wóspjetowaś (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "Awtorowe barwy lašowaś", + "pad.toolbar.import_export.title": "Import/Eksport z/do drugich datajowych formatow", + "pad.toolbar.timeslider.title": "Wersijowa historija", + "pad.toolbar.savedRevision.title": "Wersiju składowaś", + "pad.toolbar.settings.title": "Nastajenja", + "pad.toolbar.embed.title": "Toś ten zapisnik źěliś a zasajźiś", + "pad.toolbar.showusers.title": "Wužywarje na toś tom zapisniku pokazaś", + "pad.colorpicker.save": "Składowaś", + "pad.colorpicker.cancel": "Pśetergnuś", + "pad.loading": "Zacytujo se...", + "pad.passwordRequired": "Trjebaš gronidło, aby na toś ten zapisnik pśistup měł", + "pad.permissionDenied": "Njamaš pśistupne pšawo za toś ten zapisnik.", + "pad.wrongPassword": "Twójo gronidło jo wopaki było", + "pad.settings.padSettings": "Nastajenja zapisnika", + "pad.settings.myView": "Mój naglěd", + "pad.settings.stickychat": "Chat pśecej na wobrazowce pokazaś", + "pad.settings.colorcheck": "Awtorowe barwy", + "pad.settings.linenocheck": "Smužkowe numery", + "pad.settings.rtlcheck": "Wopśimjeśe wótpšawa nalěwo cytaś?", + "pad.settings.fontType": "Pismowa družyna:", + "pad.settings.fontType.normal": "Normalny", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Globalny naglěd", + "pad.settings.language": "Rěc:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Tekstowu dataju abo dokument nagraś", + "pad.importExport.importSuccessful": "Wuspěšny!", + "pad.importExport.export": "Aktualny zapisnik eksportěrowaś ako:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Lutny tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Móžoš jano z fprmatow lutnego teksta abo z HTML-formata importěrowaś. Za wěcej rozšyrjone importěrowańske funkcije \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstalěruj pšosym Abiword\u003C/a\u003E.", + "pad.modals.connected": "Zwězany.", + "pad.modals.reconnecting": "Zwězujo se znowego z twójim zapisnikom...", + "pad.modals.forcereconnect": "Znowego zwězaś", + "pad.modals.userdup": "W drugem woknje wócynjony", + "pad.modals.userdup.explanation": "Zda se, až toś ten zapisnik jo se we wěcej ako jadnem woknje wobglědowaka na toś tom licadłu wócynił.", + "pad.modals.userdup.advice": "Zwězaj znowego, aby toś to wokno město togo wužywał.", + "pad.modals.unauth": "Njeawtorizěrowany", + "pad.modals.unauth.explanation": "Pśi wobglědowanju toś togo boka su se twóje pšawa změnili. Wopytaj se znowego zwězaś.", + "pad.modals.looping.explanation": "Su komunikaciske problemy ze synchronizěrowańskim serwerom.", + "pad.modals.looping.cause": "Snaź sy pśez njekompatibelnu wognjowu murju abo proksy zwězany.", + "pad.modals.initsocketfail": "Serwer njejo dojśpiwajobny.", + "pad.modals.initsocketfail.explanation": "Zwisk ze synchronizěrowańskim serwerom njejo móžno.", + "pad.modals.initsocketfail.cause": "To jo nejskerjej problem z twójim wobglědowakom abo twójim internetnym zwiskom.", + "pad.modals.slowcommit.explanation": "Serwer njewótegranja.", + "pad.modals.slowcommit.cause": "To by mógło problem seśowego zwiska byś.", + "pad.modals.badChangeset.explanation": "Změna, kótaruž sy pśewjadł, jo se pśez synchronizěrowański serwer ako njedowólonu markěrowała.", + "pad.modals.badChangeset.cause": "To jo se snaź wopacneje serweroweje konfiguracije dla abo drugego njewócakanego zaźaeržanja dla stało. Pšosym staj se ze słužbowym administratorom do zwiska, jolic se mysliš, až to jo zmólka. Wopytaj hyšći raz zwězaś, aby z wobźěłowanim pókšacował.", + "pad.modals.corruptPad.explanation": "Zapisnik, na kótaryž coš pśistup měś, jo wobškóźony.", + "pad.modals.corruptPad.cause": "To jo se snaź wopacneje serweroweje konfiguracije dla abo drugego njewócakanego zaźaržanja dla stało. Pšosym staj se ze słužbowym administratorom do zwiska.", + "pad.modals.deleted": "Wulašowany.", + "pad.modals.deleted.explanation": "Toś ten zapisnik jo se wótpórał.", + "pad.modals.disconnected": "Zwisk jo pśetergnjony.", + "pad.modals.disconnected.explanation": "Zwisk ze serwerom jo se zgubił", + "pad.modals.disconnected.cause": "Serwer njestoj k dispoziciji. Pšosym informěruj słužbowego administratora, jolic to se dalej stawa.", + "pad.share": "Toś ten zapisnik źěliś", + "pad.share.readonly": "Jano cytajobny", + "pad.share.link": "Wótkaz", + "pad.share.emebdcode": "URL zasajźiś", + "pad.chat": "Chat", + "pad.chat.title": "Chat za toś ten zapisnik wócyniś", + "pad.chat.loadmessages": "Dalšne powěsći zacytaś", + "timeslider.pageTitle": "{{appTitle}} - wersijowa historija", + "timeslider.toolbar.returnbutton": "Slědk k zapisnikoju", + "timeslider.toolbar.authors": "Awtory:", + "timeslider.toolbar.authorsList": "Žedne awtory", + "timeslider.toolbar.exportlink.title": "Eksportěrowaś", + "timeslider.exportCurrent": "Aktualnu wersiju eksportěrowaś ako:", + "timeslider.version": "Wersija {{version}}", + "timeslider.saved": "Składowany {{day}}. {{month}} {{year}}", + "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januara", + "timeslider.month.february": "februara", + "timeslider.month.march": "měrca", + "timeslider.month.april": "apryla", + "timeslider.month.may": "maja", + "timeslider.month.june": "junija", + "timeslider.month.july": "julija", + "timeslider.month.august": "awgusta", + "timeslider.month.september": "septembra", + "timeslider.month.october": "oktobra", + "timeslider.month.november": "nowembra", + "timeslider.month.december": "decembra", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: awtor, two: awtora, few: awtory, other: awtorow ]} bźez mjenja", + "pad.savedrevs.marked": "Toś ta wersija jo se něnto ako składowana wersija markěrowała", + "pad.userlist.entername": "Zapódaj swójo mě", + "pad.userlist.unnamed": "bźez mjenja", + "pad.userlist.guest": "Gósć", + "pad.userlist.deny": "Wótpokazaś", + "pad.userlist.approve": "Pśizwóliś", + "pad.editbar.clearcolors": "Awtorowe barwy w cełem dokumenśe lašowaś?", + "pad.impexp.importbutton": "Něnto importěrowaś", + "pad.impexp.importing": "Importěrujo se...", + "pad.impexp.confirmimport": "Importowanje dataje pśepišo aktualny tekst zapisnika. Coš napšawdu pókšacowaś?", + "pad.impexp.convertFailed": "Njejsmy mógli toś tu dataju importěrowaś. Pšosym wužyj drugi dokumentowy format abo kopěruj manuelnje", + "pad.impexp.uploadFailed": "Nagraśe njejo se raźiło, pšosym wopytaj hyšći raz", + "pad.impexp.importfailed": "Import njejo se raził", + "pad.impexp.copypaste": "Pšosym kopěrowaś a zasajźiś", + "pad.impexp.exportdisabled": "Eksport ako format {{type}} jo znjemóžnjony. Pšosym staj se ze swójim systemowym administratorom za drobnostki do zwiska." +} \ No newline at end of file diff --git a/src/locales/el.json b/src/locales/el.json index 8696c08b..2de32228 100644 --- a/src/locales/el.json +++ b/src/locales/el.json @@ -71,7 +71,9 @@ "pad.modals.slowcommit.explanation": "Ο διακομιστής δεν αποκρίνεται.", "pad.modals.slowcommit.cause": "Αυτό μπορεί να οφείλεται σε προβλήματα σύνδεσης δικτύου.", "pad.modals.badChangeset.explanation": "Μια επεξεργασία που κάνατε χαρακτηρίστηκε ως παράνομη από τον διακομιστή συγχρονισμού.", + "pad.modals.badChangeset.cause": "Αυτό μπορεί να οφείλεται σε ένα λάθος στη ρύθμιση του διακομιστή ή κάποια άλλη απρόβλεπτη συμπεριφορά. Παρακαλώ επικοινωνήστε με τον διαχειριστή της υπηρεσίας, εάν πιστεύετε πως αυτό οφείλεται σε σφάλμα. Δοκιμάστε να επανασυνδεθείτε για να συνεχίσετε την επεξεργασία.", "pad.modals.corruptPad.explanation": "Το pad που προσπαθείτε να επισκεφτείτε είναι κατεστραμμένο.", + "pad.modals.corruptPad.cause": "Αυτό μπορεί να οφείλεται σε ένα λάθος στη ρύθμιση του διακομιστή ή κάποια άλλη απρόβλεπτη συμπεριφορά. Παρακαλώ επικοινωνήστε με τον διαχειριστή της υπηρεσίας.", "pad.modals.deleted": "Διεγράφη.", "pad.modals.deleted.explanation": "Αυτό το pad έχει καταργηθεί.", "pad.modals.disconnected": "Έχετε αποσυνδεθεί.", diff --git a/src/locales/fa.json b/src/locales/fa.json index 2cc29f01..e006df2a 100644 --- a/src/locales/fa.json +++ b/src/locales/fa.json @@ -17,8 +17,8 @@ "pad.toolbar.strikethrough.title": "خط خورده", "pad.toolbar.ol.title": "فهرست مرتب شده", "pad.toolbar.ul.title": "فهرست مرتب نشده", - "pad.toolbar.indent.title": "تورفتگی", - "pad.toolbar.unindent.title": "بیرون رفتگی", + "pad.toolbar.indent.title": "تورفتگی (TAB)", + "pad.toolbar.unindent.title": "بیرون رفتگی (Shift+TAB)", "pad.toolbar.undo.title": "باطل‌کردن (Ctrl-Z)", "pad.toolbar.redo.title": "از نو (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "پاک‌کردن رنگ‌های نویسندگی", @@ -118,8 +118,8 @@ "pad.editbar.clearcolors": "رنگ نویسندگی از همه‌ی سند پاک شود؟", "pad.impexp.importbutton": "هم اکنون درون‌ریزی کن", "pad.impexp.importing": "در حال درون‌ریزی...", - "pad.impexp.confirmimport": "با درون‌ریزی یک فایل نوشته‌ی کنونی دفترچه پاک می‌شود. آیا می‌خواهید ادامه دهید؟", - "pad.impexp.convertFailed": "ما نمی‌توانیم این فایل را درون‌ریزی کنیم. خواهشمندیم قالب دیگری برای سندتان انتخاب کرده یا بصورت دستی آنرا کپی کنید", + "pad.impexp.confirmimport": "با درون‌ریزی یک پرونده نوشتهٔ کنونی دفترچه پاک می‌شود. آیا می‌خواهید ادامه دهید؟", + "pad.impexp.convertFailed": "ما نمی‌توانیم این پرونده را درون‌ریزی کنیم. خواهشمندیم قالب دیگری برای سندتان انتخاب کرده یا بصورت دستی آنرا کپی کنید", "pad.impexp.uploadFailed": "آپلود انجام نشد، دوباره تلاش کنید", "pad.impexp.importfailed": "درون‌ریزی انجام نشد", "pad.impexp.copypaste": "کپی پیست کنید", diff --git a/src/locales/hsb.json b/src/locales/hsb.json new file mode 100644 index 00000000..ed23b033 --- /dev/null +++ b/src/locales/hsb.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "Michawiki" + ] + }, + "index.newPad": "Nowy zapisnik", + "index.createOpenPad": "abo wutwor/wočiń zapisnik z mjenom:", + "pad.toolbar.bold.title": "Tučny (Strg-B)", + "pad.toolbar.italic.title": "Kursiwny (Strg-I)", + "pad.toolbar.underline.title": "Podšmórnyć (Strg-U)", + "pad.toolbar.strikethrough.title": "Přešmórnyć", + "pad.toolbar.ol.title": "Čisłowana lisćina", + "pad.toolbar.ul.title": "Naličenje", + "pad.toolbar.indent.title": "Zasunyć (TAB)", + "pad.toolbar.unindent.title": "Wusunyć (Umsch+TAB)", + "pad.toolbar.undo.title": "Cofnyć (Strg-Z)", + "pad.toolbar.redo.title": "Wospjetować (Strg-Y)", + "pad.toolbar.clearAuthorship.title": "Awtorowe barby wotstronić", + "pad.toolbar.import_export.title": "Import/Eksport z/do druhich datajowych formatow", + "pad.toolbar.timeslider.title": "Historijowa strona", + "pad.toolbar.savedRevision.title": "Wersiju składować", + "pad.toolbar.settings.title": "Nastajenja", + "pad.toolbar.embed.title": "Tutón zapisnik dźělić a zasadźić", + "pad.toolbar.showusers.title": "Wužiwarjow na tutym zapisniku pokazać", + "pad.colorpicker.save": "Składować", + "pad.colorpicker.cancel": "Přetorhnyć", + "pad.loading": "Začituje so...", + "pad.passwordRequired": "Trjebaš hesło, zo by na tutón zapisnik přistup měł", + "pad.permissionDenied": "Nimaće prawo za přistup na tutón zapisnik.", + "pad.wrongPassword": "Twoje hesło bě wopak", + "pad.settings.padSettings": "Nastajenja zapisnika", + "pad.settings.myView": "Mój napohlad", + "pad.settings.stickychat": "Chat přeco na wobrazowce pokazać", + "pad.settings.colorcheck": "Awtorowe barby", + "pad.settings.linenocheck": "Linkowe čisła", + "pad.settings.rtlcheck": "Wobsah wotprawa nalěwo čitać?", + "pad.settings.fontType": "Pismowa družina:", + "pad.settings.fontType.normal": "Normalny", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Globalny napohlad", + "pad.settings.language": "Rěč:", + "pad.importExport.import_export": "Import/Eksport", + "pad.importExport.import": "Tekstowu dataju abo dokument nahrać", + "pad.importExport.importSuccessful": "Wuspěšny!", + "pad.importExport.export": "Aktualny zapisnik eksportować jako:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Luty tekst", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Móžeš jenož z formatow luteho teksta abo z HTML-formata importować. Za bóle rozšěrjene importowanske funkcije \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstaluj prošu Abiword\u003C/a\u003E.", + "pad.modals.connected": "Zwjazany.", + "pad.modals.reconnecting": "Zwjazuje so znowa z twojim zapisnikom...", + "pad.modals.forcereconnect": "Znowa zwjazać", + "pad.modals.userdup": "W druhim woknje wočinjeny", + "pad.modals.userdup.explanation": "Zda so, zo tutón zapisnik je so we wjace hač jednym woknje wobhladowaka na tutym ličaku wočinił.", + "pad.modals.userdup.advice": "Zwjazaj znowa, zo by tute wokno město toho wužiwał.", + "pad.modals.unauth": "Njeawtorizowany", + "pad.modals.unauth.explanation": "Při wobhladowanju tuteje strony su so twoje prawa změnili. Spytaj so znowa zwjazać.", + "pad.modals.looping.explanation": "Su komunikaciske problemy ze synchronizowanskim serwerom.", + "pad.modals.looping.cause": "Snano sy přez njekompatibelnu wohnjowu murju abo proksy zwjazany.", + "pad.modals.initsocketfail": "Serwer je njedocpějomny.", + "pad.modals.initsocketfail.explanation": "Zwisk ze synchronizowanskim serwerom móžno njeje.", + "pad.modals.initsocketfail.cause": "To je najskerje problem z twojim wobhladowakom abo twojim internetnym zwiskom.", + "pad.modals.slowcommit.explanation": "Serwer njewotmołwja.", + "pad.modals.slowcommit.cause": "To móhło problem syćoweho zwiska być.", + "pad.modals.badChangeset.explanation": "Změna, kotruž sy přewjedł, je so přez synchronizowanski serwer jako njedowolenu woznamjeniła.", + "pad.modals.badChangeset.cause": "To je so snano wopačneje serweroweje konfiguracije dla abo druheho njewočakowaneho zadźerženja dla stało. Prošu staj so ze słužbowym administratorom do zwiska, jeli sej mysliš, zo to je zmylk. Spytaj hišće raz zwjazać, zo by z wobdźěłowanjom pokročował.", + "pad.modals.corruptPad.explanation": "Zapisnik, na kotryž chceš přistup měć, je wobškodźeny.", + "pad.modals.corruptPad.cause": "To je so snano wopačneje serweroweje konfiguracije dla abo druheho njewočakowaneho zadźerženja dla stało. Prošu staj so ze słužbowym administratorom do zwiska.", + "pad.modals.deleted": "Zhašany.", + "pad.modals.deleted.explanation": "Tutón zapisnik je so wotstronił.", + "pad.modals.disconnected": "Zwisk je přetorhnjeny.", + "pad.modals.disconnected.explanation": "Zwisk ze serwerom je so zhubił", + "pad.modals.disconnected.cause": "Serwer k dispoziciji njesteji. Prošu informuj słužboweho administratora, jeli to so dale stawa.", + "pad.share": "Tutón zapisnik dźělić", + "pad.share.readonly": "Jenož čitajomny", + "pad.share.link": "Wotkaz", + "pad.share.emebdcode": "URL zasadźić", + "pad.chat": "Chat", + "pad.chat.title": "Chat za tutón zapisnik wočinić", + "pad.chat.loadmessages": "Dalše powěsće začitać", + "timeslider.pageTitle": "{{appTitle}} - wersijowa historija", + "timeslider.toolbar.returnbutton": "Wróćo k zapisnikej", + "timeslider.toolbar.authors": "Awtorojo:", + "timeslider.toolbar.authorsList": "Žane awtorojo", + "timeslider.toolbar.exportlink.title": "Eksportować", + "timeslider.exportCurrent": "Aktualnu wersiju eksportować jako:", + "timeslider.version": "Wersija {{version}}", + "timeslider.saved": "Składowany {{day}}. {{month}} {{year}}", + "timeslider.dateformat": "{{day}}. {{month}} {{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "januara", + "timeslider.month.february": "februara", + "timeslider.month.march": "měrca", + "timeslider.month.april": "apryla", + "timeslider.month.may": "meje", + "timeslider.month.june": "junija", + "timeslider.month.july": "julija", + "timeslider.month.august": "awgusta", + "timeslider.month.september": "septembra", + "timeslider.month.october": "oktobra", + "timeslider.month.november": "nowembra", + "timeslider.month.december": "decembra", + "timeslider.unnamedauthors": "{{num}} {[plural(num) one: awtor, two: awtoraj, few: awtorojo, other: awtorow ]} bjez mjena", + "pad.savedrevs.marked": "Tuta wersija je so nětko jako składowana wersija woznamjeniła", + "pad.userlist.entername": "Zapodaj swoje mjeno", + "pad.userlist.unnamed": "bjez mjena", + "pad.userlist.guest": "Hósć", + "pad.userlist.deny": "Wotpokazać", + "pad.userlist.approve": "Schwalić", + "pad.editbar.clearcolors": "Awtorowe barby w cyłym dokumenće zhašeć?", + "pad.impexp.importbutton": "Nětko importować", + "pad.impexp.importing": "Importuje so...", + "pad.impexp.confirmimport": "Importowanje dataje přepisa aktualny tekst zapisnika. Chceš woprawdźe pokročować?", + "pad.impexp.convertFailed": "Njemóžachmy tutu dataju importować. Prošu wužij druhi dokumentowy format abo kopěruj manuelnje", + "pad.impexp.uploadFailed": "Nahraće njeje so poradźiło, prošu spytaj hišće raz", + "pad.impexp.importfailed": "Import njeje so poradźiło", + "pad.impexp.copypaste": "Prošu kopěrować a zasadźić", + "pad.impexp.exportdisabled": "Eksport jako format {{type}} je znjemóžnjeny. Prošu staj so ze swojim systemowym administratorom za podrobnosće do zwiska." +} \ No newline at end of file diff --git a/src/locales/hu.json b/src/locales/hu.json index c3f594ce..86507861 100644 --- a/src/locales/hu.json +++ b/src/locales/hu.json @@ -15,8 +15,8 @@ "pad.toolbar.strikethrough.title": "Áthúzás", "pad.toolbar.ol.title": "Számozott lista", "pad.toolbar.ul.title": "Számozatlan lista", - "pad.toolbar.indent.title": "Behúzás növelése", - "pad.toolbar.unindent.title": "Behúzás csökkentése", + "pad.toolbar.indent.title": "Behúzás növelése (TAB)", + "pad.toolbar.unindent.title": "Behúzás csökkentése (Shift+TAB)", "pad.toolbar.undo.title": "Vissza (Ctrl-Z)", "pad.toolbar.redo.title": "Újra (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Szerzők színezésének kikapcsolása", diff --git a/src/locales/km.json b/src/locales/km.json index 2e4a3847..f1c0f9c6 100644 --- a/src/locales/km.json +++ b/src/locales/km.json @@ -20,16 +20,28 @@ "pad.toolbar.import_export.title": "នាំចូល/នាំចេញ ពី/ទៅប្រភេទឯកសារផ្សេងទៀត", "pad.toolbar.savedRevision.title": "រក្សាទុកកំណែ", "pad.toolbar.settings.title": "ការកំណត់​", + "pad.toolbar.embed.title": "ចែក​រំលែក​និង​បង្កប់​ផេត​នេះ", + "pad.toolbar.showusers.title": "បង្ហាញ​អ្នក​ប្រើ​លើ​ផេត​នេះ", "pad.colorpicker.save": "រក្សាទុក", "pad.colorpicker.cancel": "បោះបង់", "pad.loading": "កំពុងផ្ទុក…", + "pad.passwordRequired": "អ្នក​ត្រូវ​មាន​ពាក្យ​សម្ងាត់ ដើម្បី​ចូល​ផេត​នេះ", + "pad.permissionDenied": "អ្នក​មិន​មាន​សិទ្ធិ​ចូល​ផេត​នេះ​ទេ", + "pad.wrongPassword": "ពាក្យ​សម្ងាត់​របស់​អ្នក ខុស​ហើយ", + "pad.settings.padSettings": "ការ​កំណត់​ផេត", "pad.settings.myView": "គំហើញរបស់ខ្ញុំ", + "pad.settings.stickychat": "តែង​បង្ហាញ​ការ​ជជែក​លើ​អេក្រង់", + "pad.settings.linenocheck": "លេខ​បន្ទាត់", + "pad.settings.rtlcheck": "អាន​ពី​ស្ដាំ​ទៅ​ឆ្វេង?", "pad.settings.fontType": "ប្រភេទពុម្ពអក្សរ៖", "pad.settings.fontType.normal": "ធម្មតា", + "pad.settings.fontType.monospaced": "Monospace", "pad.settings.globalView": "គំហើញសកល", "pad.settings.language": "ភាសា៖", "pad.importExport.import_export": "នាំចូល/នាំចេញ", + "pad.importExport.import": "ផ្ទុក​ឡើង​ឯកសារ​អត្ថបទ​ណាមួយ", "pad.importExport.importSuccessful": "ដោយជោគជ័យ!", + "pad.importExport.export": "នាំ​ចេញ​ផេត​បច្ចុប្បន្ន​ជា៖", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Plain text", "pad.importExport.exportword": "Microsoft Word", @@ -37,8 +49,32 @@ "pad.importExport.exportopen": "ODF (Open Document Format)", "pad.importExport.exportdokuwiki": "DokuWiki", "pad.modals.connected": "បាន​តភ្ជាប់​។", + "pad.modals.reconnecting": "កំពុង​ភ្ជាប់​ទៅ​ផេត​របស់​អ្នក​ម្ដង​ទៀត..", + "pad.modals.forcereconnect": "បង្ខំ​ឲ្យ​ភ្ជាប់​ឡើង​វិញ", + "pad.modals.userdup": "បាន​បើក​ក្នុង​វីនដូ​មួយ​ទៀត", + "pad.modals.unauth.explanation": "សិទ្ធិ​របស់​អ្នក​ត្រូវ​បាន​ប្ដូរ ខណៈ​ពេល​កំពុង​មើល​ទំព័រ​នេះ។ សូម​ព្យាយាម​ភ្ជាប់​ឡើង​វិញ។", + "pad.modals.looping.cause": "ប្រហែល​ជា​អ្នក​បាន​ភ្ជាប់​តាម firewall ឬ ប្រុកស៊ី ដែល​មិន​ត្រូវ​គ្នា។", + "pad.modals.initsocketfail": "មិន​អាច​ទៅ​ដល់​ម៉ាស៊ីន​បម្រើ។", + "pad.modals.initsocketfail.cause": "នេះ​អាច​ជា​បញ្ហា​ជាមួយ​កម្មវិធី​អ៊ីនធឺណិត ឬ​ការ​តភ្ជាប់​អ៊ីនធឺណិត​របស់​អ្នក។", + "pad.modals.slowcommit.explanation": "មិន​មាន​ចម្លើយ​តប​ពី​ម៉ាស៊ីន​បម្រើ​ទេ។", "pad.modals.deleted": "បាន​លុប។", + "pad.modals.deleted.explanation": "បាន​លុប​ផេត​នេះ​ចេញ។", + "pad.modals.disconnected.explanation": "បាន​បាត់​ការ​តភ្ជាប់​ទៅ​ម៉ាស៊ីន​បម្រើ", + "pad.share": "ចែក​រំលែក​ផេត​នេះ", + "pad.share.readonly": "អាន​តែ​ប៉ុណ្ណោះ", "pad.share.link": "តំណ​ភ្ជាប់", + "pad.share.emebdcode": "URL បង្កប់", + "pad.chat": "ជជែក", + "pad.chat.title": "បើក​ការ​ជជែក​សម្រាប់​ផេត​នេះ។", + "pad.chat.loadmessages": "ផ្ទុក​សារ​ថែម​ទៀត", + "timeslider.toolbar.returnbutton": "ត្រឡប់​ទៅ​ផេត", + "timeslider.toolbar.authors": "អ្នក​បង្កើត៖", + "timeslider.toolbar.authorsList": "គ្មាន​អ្នក​បង្កើត", + "timeslider.toolbar.exportlink.title": "នាំចេញ", + "timeslider.exportCurrent": "នាំ​ចេញ​កំណែ​បច្ចុប្បន្ន​ជា៖", + "timeslider.version": "កំណែ {{version}}", + "timeslider.saved": "បាន​រក្សា​ទុក {{month}} {{day}}, {{year}}", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "មករា", "timeslider.month.february": "កុម្ភៈ", "timeslider.month.march": "មិនា", @@ -57,5 +93,8 @@ "pad.userlist.deny": "បដិសេធ", "pad.userlist.approve": "យល់​ព្រម", "pad.impexp.importbutton": "នាំចូលឥឡូវនេះ", - "pad.impexp.importing": "កំពុងនាំចូល​..." + "pad.impexp.importing": "កំពុងនាំចូល​...", + "pad.impexp.importfailed": "នាំចូល​មិន​បាន​សម្រេច", + "pad.impexp.copypaste": "សូម​ចម្លង​ហើយ​បិទ​ភ្ជាប់", + "pad.impexp.exportdisabled": "ការ​នាំចេញ​ជា {{type}} ត្រូវ​បាន​បិទ។ សូម​ទាក់ទង​អ្នក​គ្រប់​គ្រង​ប្រព័ន្ធ សម្រាប់​ព័ត៌មាន​បន្ថែម។" } \ No newline at end of file diff --git a/src/locales/mk.json b/src/locales/mk.json index dd741307..60648feb 100644 --- a/src/locales/mk.json +++ b/src/locales/mk.json @@ -64,7 +64,7 @@ "pad.modals.looping.cause": "Можеби сте поврзани преку нескладен огнен ѕид или застапник.", "pad.modals.initsocketfail": "Опслужувачот е недостапен.", "pad.modals.initsocketfail.explanation": "Не можев да се поврзам со усогласителниот опслужувач.", - "pad.modals.initsocketfail.cause": "Ова веројатно се должи на проблем со вашиот прелистувач или врската со интернет.", + "pad.modals.initsocketfail.cause": "Ова веројатно се должи на проблем со вашиот прелистувач или семрежната врска.", "pad.modals.slowcommit.explanation": "Опслужувачот не се одѕива.", "pad.modals.slowcommit.cause": "Ова може да се должи на проблеми со мрежното поврзување.", "pad.modals.badChangeset.explanation": "Опслужувачот за усогласување го смета уредувањето што го направивте за недопуштено.", diff --git a/src/locales/ml.json b/src/locales/ml.json index 1a51cc99..ebefe4d7 100644 --- a/src/locales/ml.json +++ b/src/locales/ml.json @@ -10,7 +10,7 @@ }, "index.newPad": "പുതിയ പാഡ്", "index.createOpenPad": "അല്ലെങ്കിൽ പേരുപയോഗിച്ച് പാഡ് സൃഷ്ടിക്കുക/തുറക്കുക:", - "pad.toolbar.bold.title": "കടുപ്പത്തിൽ (Ctrl-B)", + "pad.toolbar.bold.title": "കടുപ്പത്തിലെഴുതുക (Ctrl-B)", "pad.toolbar.italic.title": "ചെരിച്ചെഴുതുക (Ctrl-I)", "pad.toolbar.underline.title": "അടിവരയിടുക (Ctrl-U)", "pad.toolbar.strikethrough.title": "വെട്ടുക", diff --git a/src/locales/ps.json b/src/locales/ps.json index ac3b145b..2e0558cb 100644 --- a/src/locales/ps.json +++ b/src/locales/ps.json @@ -60,11 +60,12 @@ "timeslider.month.october": "اکتوبر", "timeslider.month.november": "نومبر", "timeslider.month.december": "ډيسمبر", - "timeslider.unnamedauthors": "{{num}} بېنومه ليکوالان", + "timeslider.unnamedauthors": "{{num}} بې نومه {[ډېرگړي(num) يو: ليکوال، نور: ليکوالان ]}", "pad.savedrevs.marked": "اوس دا مخکتنه د يوې خوندي شوې مخکتنې په توگه په نښه شوه", "pad.userlist.entername": "نوم مو ورکړۍ", "pad.userlist.unnamed": "بې نومه", "pad.userlist.guest": "مېلمه", "pad.userlist.deny": "ردول", - "pad.userlist.approve": "منل" + "pad.userlist.approve": "منل", + "pad.impexp.copypaste": "لطفاً لمېسل لېښل ترسره کړئ" } \ No newline at end of file diff --git a/src/locales/pt.json b/src/locales/pt.json index e91ef824..cb1359ec 100644 --- a/src/locales/pt.json +++ b/src/locales/pt.json @@ -4,7 +4,8 @@ "Hamilton Abreu", "Luckas", "Tuliouel", - "Waldir" + "Waldir", + "Imperadeiro98" ] }, "index.newPad": "Nova Nota", @@ -13,8 +14,8 @@ "pad.toolbar.italic.title": "Itálico (Ctrl-I)", "pad.toolbar.underline.title": "Sublinhado (Ctrl-U)", "pad.toolbar.strikethrough.title": "Riscar", - "pad.toolbar.ol.title": "Lista numerada", - "pad.toolbar.ul.title": "Lista", + "pad.toolbar.ol.title": "Lista ordenada", + "pad.toolbar.ul.title": "Lista desordenada", "pad.toolbar.indent.title": "Avançar", "pad.toolbar.unindent.title": "Recuar", "pad.toolbar.undo.title": "Desfazer (Ctrl-Z)", @@ -24,15 +25,20 @@ "pad.toolbar.timeslider.title": "Linha de tempo", "pad.toolbar.savedRevision.title": "Salvar revisão", "pad.toolbar.settings.title": "Configurações", - "pad.toolbar.embed.title": "Incorporar este Pad", + "pad.toolbar.embed.title": "Compartilhar e incorporar este pad", "pad.toolbar.showusers.title": "Mostrar os utilizadores nesta Nota", "pad.colorpicker.save": "Gravar", "pad.colorpicker.cancel": "Cancelar", "pad.loading": "A carregar…", + "pad.passwordRequired": "Precisa de uma senha para aceder a este pad", + "pad.permissionDenied": "Não tem permissão para aceder a este pad.", + "pad.wrongPassword": "A palavra-chave está errada", "pad.settings.padSettings": "Configurações da Nota", "pad.settings.myView": "Minha vista", + "pad.settings.stickychat": "Bate-papo sempre no ecrã", "pad.settings.colorcheck": "Cores de autoria", "pad.settings.linenocheck": "Números de linha", + "pad.settings.rtlcheck": "Ler o conteúdo da direita para a esquerda?", "pad.settings.fontType": "Tipo de letra:", "pad.settings.fontType.normal": "Normal", "pad.settings.fontType.monospaced": "Monoespaçada", @@ -40,6 +46,7 @@ "pad.settings.language": "Língua:", "pad.importExport.import_export": "Importar/Exportar", "pad.importExport.import": "Carregar qualquer ficheiro de texto ou documento", + "pad.importExport.importSuccessful": "Bem sucedido!", "pad.importExport.export": "Exportar a Nota atual como:", "pad.importExport.exporthtml": "HTML", "pad.importExport.exportplain": "Texto simples", @@ -50,10 +57,31 @@ "pad.modals.connected": "Ligado.", "pad.modals.reconnecting": "Reconectando-se ao seu bloco…", "pad.modals.forcereconnect": "Forçar reconexão", + "pad.modals.userdup": "Aberto noutra janela", + "pad.modals.userdup.explanation": "Este pad parece estar aberto em mais do que uma janela do navegador neste computador.", "pad.modals.unauth": "Não autorizado", - "pad.modals.slowcommit.explanation": "O servidor não está respondendo.", + "pad.modals.looping.explanation": "Existem problemas de comunicação com o servidor de sincronização.", + "pad.modals.initsocketfail": "O servidor está inacessível.", + "pad.modals.initsocketfail.explanation": "Não foi possível a conexão ao servidor de sincronização.", + "pad.modals.slowcommit.explanation": "O servidor não está a responder.", + "pad.modals.deleted": "Eliminado.", + "pad.modals.deleted.explanation": "Este pad foi removido.", + "pad.modals.disconnected": "Você foi desconectado.", + "pad.modals.disconnected.explanation": "A conexão com o servidor foi perdida", + "pad.modals.disconnected.cause": "O servidor pode estar indisponível. Por favor, notifique o administrador de serviço se isto continuar a acontecer.", + "pad.share": "Compartilhar este pad", + "pad.share.readonly": "Somente para leitura", + "pad.chat": "Bate-papo", + "pad.chat.title": "Abrir o bate-papo para este pad.", + "pad.chat.loadmessages": "Carregar mais mensagens", + "timeslider.toolbar.returnbutton": "Voltar ao pad", "timeslider.toolbar.authors": "Autores:", + "timeslider.toolbar.authorsList": "Sem Autores", "timeslider.toolbar.exportlink.title": "Exportar", + "timeslider.exportCurrent": "Exportar versão atual como:", + "timeslider.version": "Versão {{version}}", + "timeslider.saved": "Gravado a {{day}} de {{month}} de {{ano}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "Janeiro", "timeslider.month.february": "Fevereiro", "timeslider.month.march": "Março", @@ -66,11 +94,17 @@ "timeslider.month.october": "Outubro", "timeslider.month.november": "Novembro", "timeslider.month.december": "Dezembro", + "pad.savedrevs.marked": "Esta revisão está agora marcada como gravada", "pad.userlist.entername": "Insira o seu nome", "pad.userlist.unnamed": "sem nome", "pad.userlist.guest": "Convidado", "pad.userlist.deny": "Negar", "pad.userlist.approve": "Aprovar", + "pad.editbar.clearcolors": "Deseja limpar as cores de autoria em todo o documento?", "pad.impexp.importbutton": "Importar agora", - "pad.impexp.importing": "Importando..." + "pad.impexp.importing": "Importando...", + "pad.impexp.confirmimport": "A importação de um ficheiro irá substituir o texto atual do pad. Tem certeza que deseja continuar?", + "pad.impexp.uploadFailed": "O upload falhou. Por favor, tente novamente", + "pad.impexp.importfailed": "A importação falhou", + "pad.impexp.copypaste": "Por favor, copie e cole" } \ No newline at end of file diff --git a/src/locales/sco.json b/src/locales/sco.json new file mode 100644 index 00000000..c8c2381e --- /dev/null +++ b/src/locales/sco.json @@ -0,0 +1,122 @@ +{ + "@metadata": { + "authors": [ + "John Reid" + ] + }, + "index.newPad": "New Pad", + "index.createOpenPad": "or mak/apen ae Pad wi the name:", + "pad.toolbar.bold.title": "Bold (Ctrl-B)", + "pad.toolbar.italic.title": "Italic (Ctrl-I)", + "pad.toolbar.underline.title": "Underline (Ctrl-U)", + "pad.toolbar.strikethrough.title": "Cross-oot", + "pad.toolbar.ol.title": "Ordered leet", + "pad.toolbar.ul.title": "Onordered Leet", + "pad.toolbar.indent.title": "Indent (TAB)", + "pad.toolbar.unindent.title": "Ootdent (Shift+TAB)", + "pad.toolbar.undo.title": "Ondae (Ctrl-Z)", + "pad.toolbar.redo.title": "Redae (Ctrl-Y)", + "pad.toolbar.clearAuthorship.title": "Clear Authorship Colours", + "pad.toolbar.import_export.title": "Import/Export fae/til different file formats", + "pad.toolbar.timeslider.title": "Timeslider", + "pad.toolbar.savedRevision.title": "Hain Reveesion", + "pad.toolbar.settings.title": "Settins", + "pad.toolbar.embed.title": "Shair n Embed this pad", + "pad.toolbar.showusers.title": "Shaw the uisers oan this pad", + "pad.colorpicker.save": "Hain", + "pad.colorpicker.cancel": "Cancel", + "pad.loading": "Laidin...", + "pad.passwordRequired": "Ye need ae password fer tae access this pad", + "pad.permissionDenied": "Ye dinna hae permeession tae access this pad", + "pad.wrongPassword": "Yer password wis wrang", + "pad.settings.padSettings": "Pad Settins", + "pad.settings.myView": "Ma View", + "pad.settings.stickychat": "Tauk aye oan screen", + "pad.settings.colorcheck": "Authorship colours", + "pad.settings.linenocheck": "Line nummers", + "pad.settings.rtlcheck": "Read content fae richt til cair?", + "pad.settings.fontType": "Font type:", + "pad.settings.fontType.normal": "Normal", + "pad.settings.fontType.monospaced": "Monospace", + "pad.settings.globalView": "Global View", + "pad.settings.language": "Leid:", + "pad.importExport.import_export": "Import/Export", + "pad.importExport.import": "Upload oni tex file or document", + "pad.importExport.importSuccessful": "Success!", + "pad.importExport.export": "Export current pad as:", + "pad.importExport.exporthtml": "HTML", + "pad.importExport.exportplain": "Plain tex", + "pad.importExport.exportword": "Microsoft Word", + "pad.importExport.exportpdf": "PDF", + "pad.importExport.exportopen": "ODF (Open Document Format)", + "pad.importExport.exportdokuwiki": "DokuWiki", + "pad.importExport.abiword.innerHTML": "Ye can yinly import fae plain tex or HTML formats. Fer mair advanced import features please \u003Ca href=\"https://github.com/ether/etherpad-lite/wiki/How-to-enable-importing-and-exporting-different-file-formats-in-Ubuntu-or-OpenSuse-or-SLES-with-AbiWord\"\u003Einstall abiword\u003C/a\u003E.", + "pad.modals.connected": "Connected.", + "pad.modals.reconnecting": "Reconnectin til yer pad..", + "pad.modals.forcereconnect": "Force reconnect", + "pad.modals.userdup": "Apened in anither windae", + "pad.modals.userdup.explanation": "This pad seems tae be apened in mair than yin brouser windae on this computer.", + "pad.modals.userdup.advice": "Reconnect fer tae uise this windae instead.", + "pad.modals.unauth": "Naw authorized", + "pad.modals.unauth.explanation": "Yer permeessions hae chynged while viewing this page. Try tae reconnect.", + "pad.modals.looping.explanation": "There ar communication problems wi the synchronization server.", + "pad.modals.looping.cause": "Meyhaps ye connected through aen incompatible firewa or proxy.", + "pad.modals.initsocketfail": "Server canna be reached.", + "pad.modals.initsocketfail.explanation": "Coudna connect til the synchronization server.", + "pad.modals.initsocketfail.cause": "This is possably cause o ae problem wi yer brouser or yer wab connection.", + "pad.modals.slowcommit.explanation": "The server isna respondin.", + "pad.modals.slowcommit.cause": "This coud be cause o problems wi network connectivity.", + "pad.modals.badChangeset.explanation": "Aen eidit that ye'v made wis classeefied aes illegal bi the synchronization server.", + "pad.modals.badChangeset.cause": "This coud be cause o ae wrang server confeeguration or some ither onexpected behavior. Please contact the service admeenistrator, gif ye feel that this is ae mistak. Try tae reconnect in order tae continue editing.", + "pad.modals.corruptPad.explanation": "The pad ye'r trying te access is mingin.", + "pad.modals.corruptPad.cause": "This micht be cause o ae wrang server confeeguration or some ither onexpected behavior. Please contact the service admeenistrater.", + "pad.modals.deleted": "Deletit.", + "pad.modals.deleted.explanation": "This pad has been hif't.", + "pad.modals.disconnected": "Ye'v been disconnected.", + "pad.modals.disconnected.explanation": "The connection til the server wis loast", + "pad.modals.disconnected.cause": "The server micht be onavailable. Please notify the service admeenistrater gif this continues tae happen.", + "pad.share": "Share this pad", + "pad.share.readonly": "Read yinly", + "pad.share.link": "Link", + "pad.share.emebdcode": "Embed URL", + "pad.chat": "Chait", + "pad.chat.title": "Apen the chat fer this pad.", + "pad.chat.loadmessages": "Laid mair messages", + "timeslider.pageTitle": "{{appTitle}} Timeslider", + "timeslider.toolbar.returnbutton": "Return til pad", + "timeslider.toolbar.authors": "Authers:", + "timeslider.toolbar.authorsList": "Nae Authers", + "timeslider.toolbar.exportlink.title": "Export", + "timeslider.exportCurrent": "Export current version as:", + "timeslider.version": "Version {{version}}", + "timeslider.saved": "Saved {{day}} {{month}}, {{year}}", + "timeslider.dateformat": "{{day}}/{{month}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", + "timeslider.month.january": "Januair", + "timeslider.month.february": "Febuair", + "timeslider.month.march": "Mairch", + "timeslider.month.april": "Apryle", + "timeslider.month.may": "Mey", + "timeslider.month.june": "Juin", + "timeslider.month.july": "Julie", + "timeslider.month.august": "August", + "timeslider.month.september": "September", + "timeslider.month.october": "October", + "timeslider.month.november": "November", + "timeslider.month.december": "Dizember", + "timeslider.unnamedauthors": "{{num}} onnamed {[plural(num) one: author, other: authors ]}", + "pad.savedrevs.marked": "This reveesion is nou tagged aes ae hained reveesion", + "pad.userlist.entername": "Enter yer name", + "pad.userlist.unnamed": "onnamed", + "pad.userlist.guest": "Guest", + "pad.userlist.deny": "Bar", + "pad.userlist.approve": "Appruiv", + "pad.editbar.clearcolors": "Clear authership colours oan the entire document?", + "pad.impexp.importbutton": "Import Nou", + "pad.impexp.importing": "Importing...", + "pad.impexp.confirmimport": "Importin ae file will owerwrite the current tex o the pad. Ar ye sair ye want tae proceed?", + "pad.impexp.convertFailed": "We coudna import this file. Please uise ae different document format or copy paste manually", + "pad.impexp.uploadFailed": "The upload failed, please try again", + "pad.impexp.importfailed": "The import failed", + "pad.impexp.copypaste": "Please copy paste", + "pad.impexp.exportdisabled": "Exporting as {{type}} format is disabled. Please contact yer system admeenistrator fer details." +} \ No newline at end of file diff --git a/src/locales/sk.json b/src/locales/sk.json index 8c8759e6..878adc20 100644 --- a/src/locales/sk.json +++ b/src/locales/sk.json @@ -2,7 +2,8 @@ "@metadata": { "authors": [ "Teslaton", - "Kusavica" + "Kusavica", + "Rudko" ] }, "index.newPad": "Nový Pad", @@ -67,6 +68,7 @@ "pad.modals.initsocketfail.cause": "Príčinou je pravdepodobne problém s prehliadačom alebo internetovým pripojením.", "pad.modals.slowcommit.explanation": "Server neodpovedá.", "pad.modals.slowcommit.cause": "Príčinou môže byť problém so sieťovým pripojením.", + "pad.modals.badChangeset.explanation": "Editácia, kterú ste vykonali byla synchronizáciou serveru vyhodnotená ako nepovolená.", "pad.modals.deleted": "Odstránené.", "pad.modals.deleted.explanation": "Tento Pad bol odstránený.", "pad.modals.disconnected": "Boli ste odpojení.", diff --git a/src/locales/te.json b/src/locales/te.json index d116afb5..e537b010 100644 --- a/src/locales/te.json +++ b/src/locales/te.json @@ -3,7 +3,9 @@ "authors": [ "JVRKPRASAD", "Malkum", - "Veeven" + "Veeven", + "Chaduvari", + "Ravichandra" ] }, "index.newPad": "కొత్త పలక", @@ -54,6 +56,8 @@ "pad.modals.userdup.advice": "బదులుగా ఈ గవాక్షమును వాడడానికి మరల సంబంధం కలపండి", "pad.modals.unauth": "అధికారం లేదు", "pad.modals.unauth.explanation": "మీరు ఈ పుటను చూస్తూన్నప్పుడు మీ అనుమతులు మారాయి. మరల సంబంధం కలపడానికి ప్రయత్నించండి.", + "pad.modals.initsocketfail": "సర్వరు అందుబాటులో లేదు.", + "pad.modals.slowcommit.explanation": "సర్వరు స్పందించడం లేదు.", "pad.modals.deleted": "తొలగించబడింది ( తొలగించినది )", "pad.share": "ఈ పలకను పంచుకొను", "pad.share.readonly": "చదువుటకు మాత్రమే", @@ -61,11 +65,15 @@ "pad.share.emebdcode": "యు ఆర్ ఎల్ ను పొదగించండి", "pad.chat": "మాటామంతి", "pad.chat.title": "ఈ పలకకు మాటామంతిని తెరిచి ఉంచండి.", + "pad.chat.loadmessages": "మరిన్ని సందేశాలు తీసుకురా", "timeslider.pageTitle": "{{appTitle}} పనిసమయ సూచిక పరికరం", "timeslider.toolbar.returnbutton": "పలకకి తిరిగి వెళ్ళండి", "timeslider.toolbar.authors": "రచయితలు:", "timeslider.toolbar.authorsList": "రచయితలు లేరు", + "timeslider.toolbar.exportlink.title": "ఎగుమతి చెయ్యి", "timeslider.exportCurrent": "ప్రస్తుత అవతారాన్ని ఈ విధంగా ఎగుమతి చేయుము:", + "timeslider.saved": "{{year}}, {{month}} {{day}} న భద్రపరచబడింది", + "timeslider.dateformat": "{{month}}/{{day}}/{{year}} {{hours}}:{{minutes}}:{{seconds}}", "timeslider.month.january": "జనవరి", "timeslider.month.february": "ఫిబ్రవరి", "timeslider.month.march": "మార్చి", @@ -77,5 +85,17 @@ "timeslider.month.september": "సెప్టెంబరు", "timeslider.month.october": "అక్టోబరు", "timeslider.month.november": "నవంబరు", - "timeslider.month.december": "డిసెంబరు" + "timeslider.month.december": "డిసెంబరు", + "pad.userlist.entername": "మీ పేరు ఇవ్వండి", + "pad.userlist.unnamed": "అనామకం", + "pad.userlist.guest": "అతిథి", + "pad.userlist.deny": "తిరస్కరించు", + "pad.userlist.approve": "ఆమోదించు", + "pad.impexp.importbutton": "దిగుమతి చేసెయ్యి", + "pad.impexp.importing": "దిగుమతి చేస్తున్నాం...", + "pad.impexp.confirmimport": "దిగుమతి చేసుకోవడం వల్ల ప్యాడ్ లోఉన్న పాఠ్యం తుడిచిపెట్టుకుపోతుంది. ఇది మీకు అంగీకారమేనా?", + "pad.impexp.convertFailed": "ఈ ఫైలును దిగుమతి చేసుకోలేకపోయాం. వేరే డాక్యుమెంట్ ఫార్మాటును వాడండి లేదా మీరే కాపీ చేసి అతికించండి", + "pad.impexp.uploadFailed": "ఎక్కింపు విఫలమైంది, మళ్ళీ ప్రయత్నించండి.", + "pad.impexp.importfailed": "దిగుమతి విఫలమైంది", + "pad.impexp.copypaste": "నకలు చేసి అతికించండి" } \ No newline at end of file From a00c5054038393332cdc2e257f4f4817bfdc95b5 Mon Sep 17 00:00:00 2001 From: goldquest Date: Fri, 14 Mar 2014 17:50:37 +0100 Subject: [PATCH 138/152] Sometimes, the author2session / group2session don't exist anymore, but the session does. It should be possible to delete a session, if they don't exist --- src/node/db/SessionManager.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/node/db/SessionManager.js b/src/node/db/SessionManager.js index b6ff1ce9..71315adc 100644 --- a/src/node/db/SessionManager.js +++ b/src/node/db/SessionManager.js @@ -263,12 +263,16 @@ exports.deleteSession = function(sessionID, callback) db.remove("session:" + sessionID); //remove session from group2sessions - delete group2sessions.sessionIDs[sessionID]; - db.set("group2sessions:" + groupID, group2sessions); - + if(group2sessions != null) { // Maybe the group was already deleted + delete group2sessions.sessionIDs[sessionID]; + db.set("group2sessions:" + groupID, group2sessions); + } + //remove session from author2sessions - delete author2sessions.sessionIDs[sessionID]; - db.set("author2sessions:" + authorID, author2sessions); + if(author2sessions != null) { // Maybe the author was already deleted + delete author2sessions.sessionIDs[sessionID]; + db.set("author2sessions:" + authorID, author2sessions); + } callback(); } From 51900cbf67d2db6e73e8e72768c9f31bfa23eab4 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 16 Mar 2014 14:04:12 +0100 Subject: [PATCH 139/152] Toolbar: Allow custom dropdowns for plugins --- src/static/js/pad_editbar.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index f4fda27c..7892a085 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -139,6 +139,8 @@ var padeditbar = (function() var self = { init: function() { var self = this; + self.dropdowns = []; + $("#editbar .editbarbutton").attr("unselectable", "on"); // for IE $("#editbar").removeClass("disabledtoolbar").addClass("enabledtoolbar"); $("#editbar [data-key]").each(function () { @@ -170,6 +172,7 @@ var padeditbar = (function() }, registerDropdownCommand: function (cmd, dropdown) { dropdown = dropdown || cmd; + self.dropdowns.push(dropdown) this.registerCommand(cmd, function () { self.toggleDropDown(dropdown); }); @@ -189,19 +192,17 @@ var padeditbar = (function() }, toggleDropDown: function(moduleName, cb) { - var modules = ["settings", "connectivity", "importexport", "embed", "users"]; - // hide all modules and remove highlighting of all buttons if(moduleName == "none") { var returned = false - for(var i=0;i Date: Sun, 16 Mar 2014 15:14:21 +0100 Subject: [PATCH 140/152] Refactor toolbar.js to use consistent naming --- src/node/utils/toolbar.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/node/utils/toolbar.js b/src/node/utils/toolbar.js index a0a4fe01..fbd1a5da 100644 --- a/src/node/utils/toolbar.js +++ b/src/node/utils/toolbar.js @@ -12,9 +12,9 @@ var _ = require("underscore") defaultButtonAttributes = function (name, overrides) { return { - key: name, + command: name, localizationId: "pad.toolbar." + name + ".title", - icon: "buttonicon-" + name + class: "buttonicon-" + name }; }; @@ -96,11 +96,11 @@ _.extend(Button.prototype, { render: function () { var liAttributes = { "data-type": "button", - "data-key": this.attributes.key, + "data-key": this.attributes.command, }; return tag("li", liAttributes, tag("a", { "class": this.grouping, "data-l10n-id": this.attributes.localizationId }, - tag("span", { "class": "buttonicon " + this.attributes.icon }) + tag("span", { "class": "buttonicon " + this.attributes.class }) ) ); } @@ -160,43 +160,43 @@ module.exports = { strikethrough: defaultButtonAttributes("strikethrough"), orderedlist: { - key: "insertorderedlist", + command: "insertorderedlist", localizationId: "pad.toolbar.ol.title", - icon: "buttonicon-insertorderedlist" + class: "buttonicon-insertorderedlist" }, unorderedlist: { - key: "insertunorderedlist", + command: "insertunorderedlist", localizationId: "pad.toolbar.ul.title", - icon: "buttonicon-insertunorderedlist" + class: "buttonicon-insertunorderedlist" }, indent: defaultButtonAttributes("indent"), outdent: { - key: "outdent", + command: "outdent", localizationId: "pad.toolbar.unindent.title", - icon: "buttonicon-outdent" + class: "buttonicon-outdent" }, undo: defaultButtonAttributes("undo"), redo: defaultButtonAttributes("redo"), clearauthorship: { - key: "clearauthorship", + command: "clearauthorship", localizationId: "pad.toolbar.clearAuthorship.title", - icon: "buttonicon-clearauthorship" + class: "buttonicon-clearauthorship" }, importexport: { - key: "import_export", + command: "import_export", localizationId: "pad.toolbar.import_export.title", - icon: "buttonicon-import_export" + class: "buttonicon-import_export" }, timeslider: { - key: "showTimeSlider", + command: "showTimeSlider", localizationId: "pad.toolbar.timeslider.title", - icon: "buttonicon-history" + class: "buttonicon-history" }, savedrevision: defaultButtonAttributes("savedRevision"), From a69793a2035e50a788822bc8bae9ca3c22320419 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 16 Mar 2014 15:43:38 +0100 Subject: [PATCH 141/152] Add docs for toolbar controller and pad_editbar --- doc/api/api.md | 4 +++- doc/api/editbar.md | 28 ++++++++++++++++++++++++ doc/api/hooks_server-side.md | 41 +++++++++++++++++++++++++++++++++++- doc/api/toolbar.md | 36 +++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 doc/api/editbar.md create mode 100644 doc/api/toolbar.md diff --git a/doc/api/api.md b/doc/api/api.md index eb5bb9c9..d124e4c3 100644 --- a/doc/api/api.md +++ b/doc/api/api.md @@ -5,4 +5,6 @@ @include hooks_server-side @include editorInfo @include changeset_library -@include pluginfw \ No newline at end of file +@include pluginfw +@include toolbar +@include editbar \ No newline at end of file diff --git a/doc/api/editbar.md b/doc/api/editbar.md new file mode 100644 index 00000000..ce89c0b7 --- /dev/null +++ b/doc/api/editbar.md @@ -0,0 +1,28 @@ +# Editbar +srf/static/js/pad_editbar.js + +## isEnabled() + +## disable() + +## toggleDropDown(dropdown, callback) +Shows the dropdown `div.popup` whose `id` equals `dropdown`. + +## registerCommand(cmd, callback) +Register a handler for a specific command. Commands are fired if the corresponding button is clicked or the corresponding select is changed. + +## registerAceCommand(cmd, callback) +Creates an ace callstack and calls the callback with an ace instance: `callback(cmd, ace)`. + +Example: +``` +toolbar.registerAceCommand("insertorderedlist", function (cmd, ace) { + ace.ace_doInsertOrderedList(); +}); +``` + +## registerDropdownCommand(cmd, dropdown) +Ties a `div.popup` where `id` equals `dropdown` to a `command` fired by clicking a button. + +## triggerCommand(cmd[, item]) +Triggers a command (optionally with some internal representation of the toolbar item that triggered it). \ No newline at end of file diff --git a/doc/api/hooks_server-side.md b/doc/api/hooks_server-side.md index 0486f7d3..0bde2aad 100644 --- a/doc/api/hooks_server-side.md +++ b/doc/api/hooks_server-side.md @@ -63,7 +63,46 @@ Things in context: This hook gets called upon the rendering of an ejs template block. For any specific kind of block, you can change how that block gets rendered by modifying the content object passed in. -Have a look at `src/templates/pad.html` and `src/templates/timeslider.html` to see which blocks are available. +Available blocks in `pad.html` are: + + * `htmlHead` - after `` and immediately before the title tag + * `styles` - the style ``s + * `body` - the contents of the body tag + * `editbarMenuLeft` - the left tool bar (consider using the toolbar controller instead of manually adding html here) + * `editbarMenuRight` - right tool bar + * `afterEditbar` - allows you to add stuff immediately after the toolbar + * `userlist` - the contents of the userlist dropdown + * `loading` - the intial loading message + * `mySettings` - the left column of the settings dropdown ("My view"); intended for adding checkboxes only + * `mySettings.dropdowns` - add your dropdown settings here + * `globalSettings` - the right column of the settings dropdown ("Global view") + * `importColumn` - import form + * `exportColumn` - export form + * `modals` - Contains all connectivity messages + * `embedPopup` - the embed dropdown + * `scripts` - Add your script tags here, if you really have to (consider use client-side hooks instead) + +`timeslider.html` blocks: + + * `timesliderStyles` + * `timesliderScripts` + * `timesliderBody` + * `timesliderTop` + * `timesliderEditbarRight` + * `modals` + + `index.html` blocks: + + * `indexWrapper` - contains the form for creating new pads + +## padInitToolbar +Called from: src/node/hooks/express/specialpages.js + +Things in context: + +1. toolbar - the toolbar controller that will render the toolbar eventually + +Here you can add custom toolbar items that will be available in the toolbar config in `settings.json`. For more about the toolbar controller see the API section. ## padCreate Called from: src/node/db/Pad.js diff --git a/doc/api/toolbar.md b/doc/api/toolbar.md new file mode 100644 index 00000000..1ca61ced --- /dev/null +++ b/doc/api/toolbar.md @@ -0,0 +1,36 @@ +# Toolbar controller +src/node/utils/toolbar.js + +## button(opts) + * {Object} `opts` + * `command` - this command fill be fired on the editbar on click + * `localizationId` - will be set as `data-l10-id` + * `class` - here you can add additional classes to the button + +Returns: {Button} + +Example: +``` +var orderedlist = toolbar.button({ + command: "insertorderedlist", + localizationId: "pad.toolbar.ol.title", + class: "buttonicon-insertorderedlist" +}) +``` + +## selectButton(opts) + * {Object} `opts` + * `id` - id of the menu item + * `selectId` - id of the select element + * `command` - this command fill be fired on the editbar on change + +Returns: {SelectButton} + +## SelectButton.addOption(value, text, attributes) + * {String} value - The value of this option + * {String} text - the label text used for this option + * {Object} attributes - any additional html attributes go here (e.g. `data-l10n-id`) + +## registerButton(name, item) + * {String} name - used to reference the item in the toolbar config in settings.json + * {Button|SelectButton} item - the button to add \ No newline at end of file From e1fa43e640bfaa1e9102897d38442a705f7ce827 Mon Sep 17 00:00:00 2001 From: John McLear Date: Mon, 17 Mar 2014 19:20:32 +0000 Subject: [PATCH 142/152] quick formatting clean up --- src/node/hooks/express/webaccess.js | 2 +- src/static/js/pad.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/node/hooks/express/webaccess.js b/src/node/hooks/express/webaccess.js index 433d5094..6998853f 100644 --- a/src/node/hooks/express/webaccess.js +++ b/src/node/hooks/express/webaccess.js @@ -41,7 +41,7 @@ exports.basicAuth = function (req, res, next) { req.session.user = settings.users[username]; return cb(true); } - return hooks.aCallFirst("authenticate", {req: req, res:res, next:next, username: username, password: password}, hookResultMangle(cb)); + return hooks.aCallFirst("authenticate", {req: req, res:res, next:next, username: username, password: password}, hookResultMangle(cb)); } hooks.aCallFirst("authenticate", {req: req, res:res, next:next}, hookResultMangle(cb)); } diff --git a/src/static/js/pad.js b/src/static/js/pad.js index cca2f3eb..73fcd3d6 100644 --- a/src/static/js/pad.js +++ b/src/static/js/pad.js @@ -254,8 +254,9 @@ function handshake() //the access was not granted, give the user a message if(obj.accessStatus) { - if(!receivedClientVars) + if(!receivedClientVars){ $('.passForm').submit(require(module.id).savePassword); + } if(obj.accessStatus == "deny") { From ba38bc998e9ef2103e690213212151136afb0753 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Tue, 18 Mar 2014 12:14:27 +0000 Subject: [PATCH 143/152] Localisation updates from https://translatewiki.net. --- src/locales/fr.json | 7 ++++--- src/locales/sco.json | 12 ++++++------ src/locales/sv.json | 17 +++++++++-------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/locales/fr.json b/src/locales/fr.json index 20900640..7546a0fb 100644 --- a/src/locales/fr.json +++ b/src/locales/fr.json @@ -15,7 +15,8 @@ "Quenenni", "Rastus Vernon", "Stephane Cottin", - "Tux-tn" + "Tux-tn", + "Maxim21" ] }, "index.newPad": "Nouveau pad", @@ -26,8 +27,8 @@ "pad.toolbar.strikethrough.title": "Barré", "pad.toolbar.ol.title": "Liste ordonnée", "pad.toolbar.ul.title": "Liste non ordonnée", - "pad.toolbar.indent.title": "Indenter", - "pad.toolbar.unindent.title": "Désindenter", + "pad.toolbar.indent.title": "Indenter (TAB)", + "pad.toolbar.unindent.title": "Désindenter (Maj+TAB)", "pad.toolbar.undo.title": "Annuler (Ctrl-Z)", "pad.toolbar.redo.title": "Rétablir (Ctrl-Y)", "pad.toolbar.clearAuthorship.title": "Effacer les couleurs identifiant les auteurs", diff --git a/src/locales/sco.json b/src/locales/sco.json index c8c2381e..49b44cfa 100644 --- a/src/locales/sco.json +++ b/src/locales/sco.json @@ -26,7 +26,7 @@ "pad.colorpicker.save": "Hain", "pad.colorpicker.cancel": "Cancel", "pad.loading": "Laidin...", - "pad.passwordRequired": "Ye need ae password fer tae access this pad", + "pad.passwordRequired": "Ye need ae passwaird fer tae access this pad", "pad.permissionDenied": "Ye dinna hae permeession tae access this pad", "pad.wrongPassword": "Yer password wis wrang", "pad.settings.padSettings": "Pad Settins", @@ -59,18 +59,18 @@ "pad.modals.userdup.advice": "Reconnect fer tae uise this windae instead.", "pad.modals.unauth": "Naw authorized", "pad.modals.unauth.explanation": "Yer permeessions hae chynged while viewing this page. Try tae reconnect.", - "pad.modals.looping.explanation": "There ar communication problems wi the synchronization server.", + "pad.modals.looping.explanation": "Thaur ar communication proablems wi the synchronization server.", "pad.modals.looping.cause": "Meyhaps ye connected through aen incompatible firewa or proxy.", "pad.modals.initsocketfail": "Server canna be reached.", "pad.modals.initsocketfail.explanation": "Coudna connect til the synchronization server.", "pad.modals.initsocketfail.cause": "This is possably cause o ae problem wi yer brouser or yer wab connection.", "pad.modals.slowcommit.explanation": "The server isna respondin.", - "pad.modals.slowcommit.cause": "This coud be cause o problems wi network connectivity.", - "pad.modals.badChangeset.explanation": "Aen eidit that ye'v made wis classeefied aes illegal bi the synchronization server.", + "pad.modals.slowcommit.cause": "This coud be cause o problems wi netwairk connecteevitie.", + "pad.modals.badChangeset.explanation": "Aen eedit that ye'v makit wis classeefied aes onlegal bi the synchronization server.", "pad.modals.badChangeset.cause": "This coud be cause o ae wrang server confeeguration or some ither onexpected behavior. Please contact the service admeenistrator, gif ye feel that this is ae mistak. Try tae reconnect in order tae continue editing.", "pad.modals.corruptPad.explanation": "The pad ye'r trying te access is mingin.", "pad.modals.corruptPad.cause": "This micht be cause o ae wrang server confeeguration or some ither onexpected behavior. Please contact the service admeenistrater.", - "pad.modals.deleted": "Deletit.", + "pad.modals.deleted": "Delytit.", "pad.modals.deleted.explanation": "This pad has been hif't.", "pad.modals.disconnected": "Ye'v been disconnected.", "pad.modals.disconnected.explanation": "The connection til the server wis loast", @@ -103,7 +103,7 @@ "timeslider.month.october": "October", "timeslider.month.november": "November", "timeslider.month.december": "Dizember", - "timeslider.unnamedauthors": "{{num}} onnamed {[plural(num) one: author, other: authors ]}", + "timeslider.unnamedauthors": "{{num}} onnamed {[plural(num) one: writer, other: writers ]}", "pad.savedrevs.marked": "This reveesion is nou tagged aes ae hained reveesion", "pad.userlist.entername": "Enter yer name", "pad.userlist.unnamed": "onnamed", diff --git a/src/locales/sv.json b/src/locales/sv.json index c4455ff4..a6f23513 100644 --- a/src/locales/sv.json +++ b/src/locales/sv.json @@ -2,7 +2,8 @@ "@metadata": { "authors": [ "Lokal Profil", - "WikiPhoenix" + "WikiPhoenix", + "Jopparn" ] }, "index.newPad": "Nytt block", @@ -12,7 +13,7 @@ "pad.toolbar.underline.title": "Understruken (Ctrl-U)", "pad.toolbar.strikethrough.title": "Genomstruken", "pad.toolbar.ol.title": "Numrerad lista", - "pad.toolbar.ul.title": "Ta bort numrerad lista", + "pad.toolbar.ul.title": "Osorterad lista", "pad.toolbar.indent.title": "Öka indrag (TABB)", "pad.toolbar.unindent.title": "Minska indrag (Shift+TABB)", "pad.toolbar.undo.title": "Ångra (Ctrl-Z)", @@ -28,7 +29,7 @@ "pad.colorpicker.cancel": "Avbryt", "pad.loading": "Läser in...", "pad.passwordRequired": "Du behöver ett lösenord för att få tillgång till detta block", - "pad.permissionDenied": "Du har inte behörighet att få tillgång till detta block", + "pad.permissionDenied": "Du har inte åtkomstbehörighet för detta block", "pad.wrongPassword": "Ditt lösenord var fel", "pad.settings.padSettings": "Blockinställningar", "pad.settings.myView": "Min vy", @@ -42,7 +43,7 @@ "pad.settings.globalView": "Global vy", "pad.settings.language": "Språk:", "pad.importExport.import_export": "Importera/Exportera", - "pad.importExport.import": "Ladda upp en textfil eller dokument", + "pad.importExport.import": "Ladda upp textfiler eller dokument", "pad.importExport.importSuccessful": "Åtgärden slutfördes!", "pad.importExport.export": "Export aktuellt block som:", "pad.importExport.exporthtml": "HTML", @@ -62,18 +63,18 @@ "pad.modals.unauth.explanation": "Din behörighet ändrades medan du visar 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 inte kan nås.", + "pad.modals.initsocketfail": "Servern kan inte nås.", "pad.modals.initsocketfail.explanation": "Det gick inte att ansluta till synkroniseringsservern.", - "pad.modals.initsocketfail.cause": "Detta är beror troligen på ett problem med din webbläsare eller din internetanslutning.", + "pad.modals.initsocketfail.cause": "Detta beror troligen på ett problem med din webbläsare eller din internetanslutning.", "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 gjorde klassificerades som ogiltig av synkroniseringsservern.", + "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.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.", "pad.modals.deleted.explanation": "Detta block har tagits bort.", - "pad.modals.disconnected": "Du har kopplats från.", + "pad.modals.disconnected": "Du har blivit frånkopplad.", "pad.modals.disconnected.explanation": "Anslutningen till servern avbröts", "pad.modals.disconnected.cause": "Servern kanske är otillgänglig. Var god meddela tjänstadministratören om detta fortsätter att hända.", "pad.share": "Dela detta block", From f6f319960d053b35b9c11a3d01a6a7c9bc31eef3 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Thu, 20 Mar 2014 21:34:01 +0100 Subject: [PATCH 144/152] Fix REQ_CS rev boundary check fixes #2096 --- src/node/handler/PadMessageHandler.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/node/handler/PadMessageHandler.js b/src/node/handler/PadMessageHandler.js index ed47109d..3582c9bd 100644 --- a/src/node/handler/PadMessageHandler.js +++ b/src/node/handler/PadMessageHandler.js @@ -1372,7 +1372,7 @@ function getChangesetInfo(padId, startNum, endNum, granularity, callback) while (compositeStart < endNum) { var compositeEnd = compositeStart + granularity; - if (compositeEnd > endNum || compositeEnd > head_revision) + if (compositeEnd > endNum || compositeEnd > head_revision+1) { break; } @@ -1500,8 +1500,8 @@ function composePadChangesets(padId, startNum, endNum, callback) var changesetsNeeded=[]; var headNum = pad.getHeadRevisionNumber(); - if (endNum > headNum) - endNum = headNum; + if (endNum > headNum+1) + endNum = headNum+1; if (startNum < 0) startNum = 0; //create a array for all changesets, we will From e23af7e43999b976129379ee8f995f95512050c3 Mon Sep 17 00:00:00 2001 From: John McLear Date: Wed, 26 Mar 2014 15:44:04 +0000 Subject: [PATCH 145/152] changelog, package file and fix for redo --- CHANGELOG.md | 28 ++++++++++++++++++++++++++++ src/package.json | 2 +- src/static/js/pad_editbar.js | 2 +- 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c156eb25..e5ae13bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,31 @@ +# 1.4 + * NEW: Disable toolbar items through settings.json + * NEW: Internal stats/metrics engine + * NEW: Copy/Move Pad API functions + * NEW: getAttributeOnSelection method + * NEW: CSS function when an attribute is active on caret location + * NEW: Various new eejs blocks + * NEW: Ace afterEditHook + * NEW: Import hook to introduce alternative export methods + * NEW: preProcessDomLine allows Domline attributes to be processed before native attributes + * Fix: Allow for lighter author colors + * Fix: Improved randomness of session tokens + * Fix: Don't panic if an author2session/group2session no longer exists + * Fix: Gracefully fallback to related languages if chosen language is unavailable + * Fix: Various changeset/stability bugs + * Fix: Re-enable import buttons after failed import + * Fix: Allow browser tabs to be cycled when in editor + * Fix: Better Protocol detection + * Fix: padList API Fix + * Fix: Caret walking issue + * Fix: Better settings.json parsing + * Fix: Improved import/export handling + * Other: Various whitespace/code clean-up + * Other: .deb packaging creator + * Other: More API Documentation + * Other: Lots more translations + * Other: Support Node 0.11 + # 1.3 * NEW: We now follow the semantic versioning scheme! * NEW: Option to disable IP logging diff --git a/src/package.json b/src/package.json index 1953ecf1..f47ec474 100644 --- a/src/package.json +++ b/src/package.json @@ -52,5 +52,5 @@ "repository" : { "type" : "git", "url" : "http://github.com/ether/etherpad-lite.git" }, - "version" : "1.3.0" + "version" : "1.4.0" } diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index 7892a085..c6dd9ed8 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -297,7 +297,7 @@ var padeditbar = (function() ace.ace_doUndoRedo(cmd); }); - toolbar.registerAceCommand("redo", function (cmd) { + toolbar.registerAceCommand("redo", function (cmd, ace) { ace.ace_doUndoRedo(cmd); }); From 3a82cba4c5f7826ffdc74c88f58e53e2fca541e6 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Thu, 27 Mar 2014 18:08:55 +0100 Subject: [PATCH 146/152] Polish the styles of our docs a little --- doc/assets/style.css | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/doc/assets/style.css b/doc/assets/style.css index fe1343af..09bc9a36 100644 --- a/doc/assets/style.css +++ b/doc/assets/style.css @@ -1,3 +1,7 @@ +html { + border-top: solid green 5pt; +} + body.apidoc { width: 60%; min-width: 10cm; @@ -5,8 +9,7 @@ body.apidoc { } #header { - background-color: #5a5; - padding: 10px; + padding: 1pc 0; color: #111; } From 54bf17bfea01284929d7b8d89010b91070d5e33e Mon Sep 17 00:00:00 2001 From: John McLear Date: Sat, 29 Mar 2014 13:32:34 +0000 Subject: [PATCH 147/152] fix error on focus remove from import/export --- 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 c6dd9ed8..1857bd03 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -206,7 +206,7 @@ var padeditbar = (function() if(module.css('display') != "none") { - $("#" + modules[i] + "link").removeClass("selected"); + $("#" + module[i] + "link").removeClass("selected"); module.slideUp("fast", cb); returned = true; } From 867e40533a13e564cc89449c6640c7a973093d31 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 30 Mar 2014 12:30:18 +0200 Subject: [PATCH 148/152] Fix timeslider export dropdown --- src/static/js/pad_editbar.js | 4 ++-- src/templates/timeslider.html | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index 1857bd03..3174bf50 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -206,7 +206,7 @@ var padeditbar = (function() if(module.css('display') != "none") { - $("#" + module[i] + "link").removeClass("selected"); + $("#" + self.dropdowns[i] + "link").removeClass("selected"); module.slideUp("fast", cb); returned = true; } @@ -297,7 +297,7 @@ var padeditbar = (function() ace.ace_doUndoRedo(cmd); }); - toolbar.registerAceCommand("redo", function (cmd, ace) { + toolbar.registerAceCommand("redo", function (cmd) { ace.ace_doUndoRedo(cmd); }); diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index 2e00b8c2..4696c475 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -80,7 +80,7 @@
                <% e.begin_block("timesliderEditbarRight"); %>
                  -
                • +
                • @@ -241,6 +241,8 @@ /* TODO: These globals shouldn't exist. */ padeditbar = require('ep_etherpad-lite/static/js/pad_editbar').padeditbar; padimpexp = require('ep_etherpad-lite/static/js/pad_impexp').padimpexp; + + padeditbar.init() }); })(); From 6054cda473945dbe583621df3ab6ae5a3b35ac37 Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 30 Mar 2014 13:02:41 +0200 Subject: [PATCH 149/152] Create a customizable timeslider toolbar --- settings.json.template | 3 +++ src/node/hooks/express/specialpages.js | 9 +++++++- src/node/utils/Settings.js | 3 +++ src/node/utils/toolbar.js | 32 ++++++++++++++++++-------- src/static/css/pad.css | 4 ++++ src/static/css/timeslider.css | 7 ------ src/static/js/pad_editbar.js | 8 +++++++ src/static/js/timeslider.js | 6 ----- src/templates/timeslider.html | 9 ++------ 9 files changed, 50 insertions(+), 31 deletions(-) diff --git a/settings.json.template b/settings.json.template index e9d35dcd..38e82679 100644 --- a/settings.json.template +++ b/settings.json.template @@ -115,6 +115,9 @@ ["importexport", "timeslider", "savedrevision"], ["settings", "embed"], ["showusers"] + ], + "timeslider": [ + ["timeslider_export", "timeslider_returnToPad"] ] }, */ diff --git a/src/node/hooks/express/specialpages.js b/src/node/hooks/express/specialpages.js index 8609d657..063328fb 100644 --- a/src/node/hooks/express/specialpages.js +++ b/src/node/hooks/express/specialpages.js @@ -46,7 +46,14 @@ exports.expressCreateServer = function (hook_name, args, cb) { //serve timeslider.html under /p/$padname/timeslider args.app.get('/p/:pad/timeslider', function(req, res, next) { - res.send(eejs.require("ep_etherpad-lite/templates/timeslider.html", {req: req})); + hooks.callAll("padInitToolbar", { + toolbar: toolbar + }); + + res.send(eejs.require("ep_etherpad-lite/templates/timeslider.html", { + req: req, + toolbar: toolbar + })); }); //serve favicon.ico from all path levels except as a pad name diff --git a/src/node/utils/Settings.js b/src/node/utils/Settings.js index 9bfcae4b..4c6b7ea4 100644 --- a/src/node/utils/Settings.js +++ b/src/node/utils/Settings.js @@ -93,6 +93,9 @@ exports.toolbar = { ["importexport", "timeslider", "savedrevision"], ["settings", "embed"], ["showusers"] + ], + timeslider: [ + ["timeslider_export", "timeslider_returnToPad"] ] } diff --git a/src/node/utils/toolbar.js b/src/node/utils/toolbar.js index fbd1a5da..a4ee202c 100644 --- a/src/node/utils/toolbar.js +++ b/src/node/utils/toolbar.js @@ -14,7 +14,7 @@ defaultButtonAttributes = function (name, overrides) { return { command: name, localizationId: "pad.toolbar." + name + ".title", - class: "buttonicon-" + name + class: "buttonicon buttonicon-" + name }; }; @@ -99,8 +99,8 @@ _.extend(Button.prototype, { "data-key": this.attributes.command, }; return tag("li", liAttributes, - tag("a", { "class": this.grouping, "data-l10n-id": this.attributes.localizationId }, - tag("span", { "class": "buttonicon " + this.attributes.class }) + tag("a", { "class": this.grouping }, + tag("span", { "class": " "+ this.attributes.class, "data-l10n-id": this.attributes.localizationId }) ) ); } @@ -162,20 +162,20 @@ module.exports = { orderedlist: { command: "insertorderedlist", localizationId: "pad.toolbar.ol.title", - class: "buttonicon-insertorderedlist" + class: "buttonicon buttonicon-insertorderedlist" }, unorderedlist: { command: "insertunorderedlist", localizationId: "pad.toolbar.ul.title", - class: "buttonicon-insertunorderedlist" + class: "buttonicon buttonicon-insertunorderedlist" }, indent: defaultButtonAttributes("indent"), outdent: { command: "outdent", localizationId: "pad.toolbar.unindent.title", - class: "buttonicon-outdent" + class: "buttonicon buttonicon-outdent" }, undo: defaultButtonAttributes("undo"), @@ -184,25 +184,37 @@ module.exports = { clearauthorship: { command: "clearauthorship", localizationId: "pad.toolbar.clearAuthorship.title", - class: "buttonicon-clearauthorship" + class: "buttonicon buttonicon-clearauthorship" }, importexport: { command: "import_export", localizationId: "pad.toolbar.import_export.title", - class: "buttonicon-import_export" + class: "buttonicon buttonicon-import_export" }, timeslider: { command: "showTimeSlider", localizationId: "pad.toolbar.timeslider.title", - class: "buttonicon-history" + class: "buttonicon buttonicon-history" }, savedrevision: defaultButtonAttributes("savedRevision"), settings: defaultButtonAttributes("settings"), embed: defaultButtonAttributes("embed"), - showusers: defaultButtonAttributes("showusers") + showusers: defaultButtonAttributes("showusers"), + + timeslider_export: { + command: "import_export", + localizationId: "timeslider.toolbar.exportlink.title", + class: "buttonicon buttonicon-import_export" + }, + + timeslider_returnToPad: { + command: "timeslider_returnToPad", + localizationId: "timeslider.toolbar.returnbutton", + class: "buttontext" + } }, registerButton: function (buttonName, buttonInfo) { diff --git a/src/static/css/pad.css b/src/static/css/pad.css index 0c1153fd..4053ebba 100644 --- a/src/static/css/pad.css +++ b/src/static/css/pad.css @@ -126,6 +126,10 @@ a img { position: relative; top: 1px; } +.toolbar ul li a .buttontext { + color: #222; + font-size: 14px; +} .toolbar ul li a.grouped-left { border-radius: 3px 0 0 3px; } diff --git a/src/static/css/timeslider.css b/src/static/css/timeslider.css index b3c20184..f97d4f2b 100644 --- a/src/static/css/timeslider.css +++ b/src/static/css/timeslider.css @@ -157,13 +157,6 @@ #editbarright { float: right } -#returnbutton { - color: #222; - font-size: 16px; - line-height: 29px; - margin-top: 0; - padding-right: 6px; -} #settings, #importexport, #embed, diff --git a/src/static/js/pad_editbar.js b/src/static/js/pad_editbar.js index 3174bf50..20c2842d 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -331,6 +331,14 @@ var padeditbar = (function() ace.ace_setAttributeOnSelection('author', ''); } }); + + toolbar.registerCommand('timeslider_returnToPad', function(cmd) { + if( document.referrer.length > 0 && document.referrer.substring(document.referrer.lastIndexOf("/")-1, document.referrer.lastIndexOf("/")) === "p") { + document.location = document.referrer; + } else { + document.location = document.location.href.substring(0,document.location.href.lastIndexOf("/")); + } + }); } return self; diff --git a/src/static/js/timeslider.js b/src/static/js/timeslider.js index fd22c69a..b3c10b8a 100644 --- a/src/static/js/timeslider.js +++ b/src/static/js/timeslider.js @@ -95,12 +95,6 @@ function init() { //get all the export links export_links = $('#export > .exportlink') - if(document.referrer.length > 0 && document.referrer.substring(document.referrer.lastIndexOf("/")-1,document.referrer.lastIndexOf("/")) === "p") { - $("#returnbutton").attr("href", document.referrer); - } else { - $("#returnbutton").attr("href", document.location.href.substring(0,document.location.href.lastIndexOf("/"))); - } - $('button#forcereconnect').click(function() { window.location.reload(); diff --git a/src/templates/timeslider.html b/src/templates/timeslider.html index 4696c475..559b51b5 100644 --- a/src/templates/timeslider.html +++ b/src/templates/timeslider.html @@ -80,14 +80,9 @@
                  <% e.begin_block("timesliderEditbarRight"); %>
                    -
                  • - -
                    -
                    -
                  • + <%- toolbar.menu(settings.toolbar.timeslider) %>
                  - - <% e.end_block(); %> + <% e.end_block(); %>
                  From 80e45e1192e4f3c66d3c35962fbbbfb980fa624c Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 30 Mar 2014 13:05:51 +0200 Subject: [PATCH 150/152] Fix redo toolbar command, again. --- 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 20c2842d..9d42cba7 100644 --- a/src/static/js/pad_editbar.js +++ b/src/static/js/pad_editbar.js @@ -297,7 +297,7 @@ var padeditbar = (function() ace.ace_doUndoRedo(cmd); }); - toolbar.registerAceCommand("redo", function (cmd) { + toolbar.registerAceCommand("redo", function (cmd, ace) { ace.ace_doUndoRedo(cmd); }); From 33ecc1d8df644c3a2b68a1f9f09796e269fcbc0f Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 30 Mar 2014 13:08:26 +0200 Subject: [PATCH 151/152] Update docs --- doc/api/toolbar.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/doc/api/toolbar.md b/doc/api/toolbar.md index 1ca61ced..03a3d8f8 100644 --- a/doc/api/toolbar.md +++ b/doc/api/toolbar.md @@ -14,7 +14,17 @@ Example: var orderedlist = toolbar.button({ command: "insertorderedlist", localizationId: "pad.toolbar.ol.title", - class: "buttonicon-insertorderedlist" + class: "buttonicon buttonicon-insertorderedlist" +}) +``` + +You can also create buttons with text: + +``` +var myButton = toolbar.button({ + command: "myButton", + localizationId: "myPlugin.toolbar.myButton", + class: "buttontext" }) ``` From a7671a690bc13a2e0071432a0b914c52e1cc9c0c Mon Sep 17 00:00:00 2001 From: Marcel Klehr Date: Sun, 30 Mar 2014 15:10:29 +0200 Subject: [PATCH 152/152] docs: update api version --- doc/api/http_api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/http_api.md b/doc/api/http_api.md index 1ae2ea1c..2d6e7909 100644 --- a/doc/api/http_api.md +++ b/doc/api/http_api.md @@ -61,7 +61,7 @@ Portal submits content into new blog post ## Usage ### API version -The latest version is `1.2.8` +The latest version is `1.2.9` The current version can be queried via /api.