formatting: bulk remove trailing whitespaces

Do not touch vendorized files (e.g. libraries that were imported from external
projects).

No functional changes.

Command:
    find . -name '*.<EXTENSION>' -type f -print0 | xargs -0 sed -i 's/[[:space:]]*$//'
This commit is contained in:
muxator 2019-10-20 02:09:22 +02:00
parent 24abd9ca07
commit 312c72c364
28 changed files with 156 additions and 156 deletions

View file

@ -10,7 +10,7 @@
* contain meaningful and detailed **commit messages** in the form: * contain meaningful and detailed **commit messages** in the form:
``` ```
submodule: description submodule: description
longer description of the change you have made, eventually mentioning the longer description of the change you have made, eventually mentioning the
number of the issue that is being fixed, in the form: Fixes #someIssueNumber number of the issue that is being fixed, in the form: Fixes #someIssueNumber
``` ```
@ -131,4 +131,4 @@ Etherpad is much more than software. So if you aren't a developer then worry no
* Work with SFC to maintain legal side of project * Work with SFC to maintain legal side of project
* Maintain TODO page - https://github.com/ether/etherpad-lite/wiki/TODO#IMPORTANT_TODOS * Maintain TODO page - https://github.com/ether/etherpad-lite/wiki/TODO#IMPORTANT_TODOS
* Replying to messages on IRC / The Mailing list / Emails * Replying to messages on IRC / The Mailing list / Emails

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# IMPORTANT # IMPORTANT
# Protect against misspelling a var and rm -rf / # Protect against misspelling a var and rm -rf /
set -u set -u
set -e set -e

View file

@ -11,21 +11,21 @@ if [ -d "../bin" ]; then
fi fi
#Is wget installed? #Is wget installed?
hash wget > /dev/null 2>&1 || { hash wget > /dev/null 2>&1 || {
echo "Please install wget" >&2 echo "Please install wget" >&2
exit 1 exit 1
} }
#Is zip installed? #Is zip installed?
hash zip > /dev/null 2>&1 || { hash zip > /dev/null 2>&1 || {
echo "Please install zip" >&2 echo "Please install zip" >&2
exit 1 exit 1
} }
#Is zip installed? #Is zip installed?
hash unzip > /dev/null 2>&1 || { hash unzip > /dev/null 2>&1 || {
echo "Please install unzip" >&2 echo "Please install unzip" >&2
exit 1 exit 1
} }
START_FOLDER=$(pwd); START_FOLDER=$(pwd);

View file

@ -26,10 +26,10 @@ log("open output file...");
var sqlOutput = fs.openSync(sqlOutputFile, "w"); var sqlOutput = fs.openSync(sqlOutputFile, "w");
var sql = "SET CHARACTER SET UTF8;\n" + var sql = "SET CHARACTER SET UTF8;\n" +
"CREATE TABLE IF NOT EXISTS `store` ( \n" + "CREATE TABLE IF NOT EXISTS `store` ( \n" +
"`key` VARCHAR( 100 ) NOT NULL , \n" + "`key` VARCHAR( 100 ) NOT NULL , \n" +
"`value` LONGTEXT NOT NULL , \n" + "`value` LONGTEXT NOT NULL , \n" +
"PRIMARY KEY ( `key` ) \n" + "PRIMARY KEY ( `key` ) \n" +
") ENGINE = INNODB;\n" + ") ENGINE = INNODB;\n" +
"START TRANSACTION;\n\n"; "START TRANSACTION;\n\n";
fs.writeSync(sqlOutput, sql); fs.writeSync(sqlOutput, sql);
log("done"); log("done");
@ -52,7 +52,7 @@ async.series([
function(callback) function(callback)
{ {
log("get all padIds out of the database..."); log("get all padIds out of the database...");
etherpadDB.query("SELECT ID FROM PAD_META", [], function(err, _padIDs) etherpadDB.query("SELECT ID FROM PAD_META", [], function(err, _padIDs)
{ {
padIDs = _padIDs; padIDs = _padIDs;
@ -62,9 +62,9 @@ async.series([
function(callback) function(callback)
{ {
log("done"); log("done");
//create a queue with a concurrency 100 //create a queue with a concurrency 100
var queue = async.queue(function (padId, callback) var queue = async.queue(function (padId, callback)
{ {
convertPad(padId, function(err) convertPad(padId, function(err)
{ {
@ -72,10 +72,10 @@ async.series([
callback(err); callback(err);
}); });
}, 100); }, 100);
//set the step callback as the queue callback //set the step callback as the queue callback
queue.drain = callback; queue.drain = callback;
//add the padids to the worker queue //add the padids to the worker queue
for(var i=0,length=padIDs.length;i<length;i++) for(var i=0,length=padIDs.length;i<length;i++)
{ {
@ -85,25 +85,25 @@ async.series([
], function(err) ], function(err)
{ {
if(err) throw err; if(err) throw err;
//write the groups //write the groups
var sql = ""; var sql = "";
for(var proID in proID2groupID) for(var proID in proID2groupID)
{ {
var groupID = proID2groupID[proID]; var groupID = proID2groupID[proID];
var subdomain = proID2subdomain[proID]; var subdomain = proID2subdomain[proID];
sql+="REPLACE INTO store VALUES (" + etherpadDB.escape("group:" + groupID) + ", " + etherpadDB.escape(JSON.stringify(groups[groupID]))+ ");\n"; sql+="REPLACE INTO store VALUES (" + etherpadDB.escape("group:" + groupID) + ", " + etherpadDB.escape(JSON.stringify(groups[groupID]))+ ");\n";
sql+="REPLACE INTO store VALUES (" + etherpadDB.escape("mapper2group:subdomain:" + subdomain) + ", " + etherpadDB.escape(groupID)+ ");\n"; sql+="REPLACE INTO store VALUES (" + etherpadDB.escape("mapper2group:subdomain:" + subdomain) + ", " + etherpadDB.escape(groupID)+ ");\n";
} }
//close transaction //close transaction
sql+="COMMIT;"; sql+="COMMIT;";
//end the sql file //end the sql file
fs.writeSync(sqlOutput, sql, undefined, "utf-8"); fs.writeSync(sqlOutput, sql, undefined, "utf-8");
fs.closeSync(sqlOutput); fs.closeSync(sqlOutput);
log("finished."); log("finished.");
process.exit(0); process.exit(0);
}); });
@ -118,7 +118,7 @@ var padsDone = 0;
function incrementPadStats() function incrementPadStats()
{ {
padsDone++; padsDone++;
if(padsDone%100 == 0) if(padsDone%100 == 0)
{ {
var averageTime = Math.round(padsDone/((Date.now() - startTime)/1000)); var averageTime = Math.round(padsDone/((Date.now() - startTime)/1000));
@ -149,10 +149,10 @@ function convertPad(padId, callback)
function(callback) function(callback)
{ {
var sql = "SELECT * FROM `PAD_CHAT_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_CHAT_META` WHERE ID=?)"; var sql = "SELECT * FROM `PAD_CHAT_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_CHAT_META` WHERE ID=?)";
etherpadDB.query(sql, [padId], function(err, results) etherpadDB.query(sql, [padId], function(err, results)
{ {
if(!err) if(!err)
{ {
try try
{ {
@ -163,7 +163,7 @@ function convertPad(padId, callback)
} }
}catch(e) {err = e} }catch(e) {err = e}
} }
callback(err); callback(err);
}); });
}, },
@ -171,10 +171,10 @@ function convertPad(padId, callback)
function(callback) function(callback)
{ {
var sql = "SELECT * FROM `PAD_REVS_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_REVS_META` WHERE ID=?)"; var sql = "SELECT * FROM `PAD_REVS_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_REVS_META` WHERE ID=?)";
etherpadDB.query(sql, [padId], function(err, results) etherpadDB.query(sql, [padId], function(err, results)
{ {
if(!err) if(!err)
{ {
try try
{ {
@ -185,7 +185,7 @@ function convertPad(padId, callback)
} }
}catch(e) {err = e} }catch(e) {err = e}
} }
callback(err); callback(err);
}); });
}, },
@ -193,10 +193,10 @@ function convertPad(padId, callback)
function(callback) function(callback)
{ {
var sql = "SELECT * FROM `PAD_REVMETA_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_REVMETA_META` WHERE ID=?)"; var sql = "SELECT * FROM `PAD_REVMETA_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_REVMETA_META` WHERE ID=?)";
etherpadDB.query(sql, [padId], function(err, results) etherpadDB.query(sql, [padId], function(err, results)
{ {
if(!err) if(!err)
{ {
try try
{ {
@ -207,7 +207,7 @@ function convertPad(padId, callback)
} }
}catch(e) {err = e} }catch(e) {err = e}
} }
callback(err); callback(err);
}); });
}, },
@ -215,7 +215,7 @@ function convertPad(padId, callback)
function(callback) function(callback)
{ {
var sql = "SELECT `JSON` FROM `PAD_APOOL` WHERE `ID` = ?"; var sql = "SELECT `JSON` FROM `PAD_APOOL` WHERE `ID` = ?";
etherpadDB.query(sql, [padId], function(err, results) etherpadDB.query(sql, [padId], function(err, results)
{ {
if(!err) if(!err)
@ -225,7 +225,7 @@ function convertPad(padId, callback)
apool=JSON.parse(results[0].JSON).x; apool=JSON.parse(results[0].JSON).x;
}catch(e) {err = e} }catch(e) {err = e}
} }
callback(err); callback(err);
}); });
}, },
@ -233,10 +233,10 @@ function convertPad(padId, callback)
function(callback) function(callback)
{ {
var sql = "SELECT * FROM `PAD_AUTHORS_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_AUTHORS_META` WHERE ID=?)"; var sql = "SELECT * FROM `PAD_AUTHORS_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_AUTHORS_META` WHERE ID=?)";
etherpadDB.query(sql, [padId], function(err, results) etherpadDB.query(sql, [padId], function(err, results)
{ {
if(!err) if(!err)
{ {
try try
{ {
@ -247,7 +247,7 @@ function convertPad(padId, callback)
} }
}catch(e) {err = e} }catch(e) {err = e}
} }
callback(err); callback(err);
}); });
}, },
@ -255,17 +255,17 @@ function convertPad(padId, callback)
function(callback) function(callback)
{ {
var sql = "SELECT JSON FROM `PAD_META` WHERE ID=?"; var sql = "SELECT JSON FROM `PAD_META` WHERE ID=?";
etherpadDB.query(sql, [padId], function(err, results) etherpadDB.query(sql, [padId], function(err, results)
{ {
if(!err) if(!err)
{ {
try try
{ {
padmeta = JSON.parse(results[0].JSON).x; padmeta = JSON.parse(results[0].JSON).x;
}catch(e) {err = e} }catch(e) {err = e}
} }
callback(err); callback(err);
}); });
}, },
@ -278,19 +278,19 @@ function convertPad(padId, callback)
callback(); callback();
return; return;
} }
//get the proID out of this padID //get the proID out of this padID
var proID = padId.split("$")[0]; var proID = padId.split("$")[0];
var sql = "SELECT subDomain FROM pro_domains WHERE ID = ?"; var sql = "SELECT subDomain FROM pro_domains WHERE ID = ?";
etherpadDB.query(sql, [proID], function(err, results) etherpadDB.query(sql, [proID], function(err, results)
{ {
if(!err) if(!err)
{ {
subdomain = results[0].subDomain; subdomain = results[0].subDomain;
} }
callback(err); callback(err);
}); });
} }
@ -300,105 +300,105 @@ function convertPad(padId, callback)
{ {
//saves all values that should be written to the database //saves all values that should be written to the database
var values = {}; var values = {};
//this is a pro pad, let's convert it to a group pad //this is a pro pad, let's convert it to a group pad
if(padId.indexOf("$") != -1) if(padId.indexOf("$") != -1)
{ {
var padIdParts = padId.split("$"); var padIdParts = padId.split("$");
var proID = padIdParts[0]; var proID = padIdParts[0];
var padName = padIdParts[1]; var padName = padIdParts[1];
var groupID var groupID
//this proID is not converted so far, do it //this proID is not converted so far, do it
if(proID2groupID[proID] == null) if(proID2groupID[proID] == null)
{ {
groupID = "g." + randomString(16); groupID = "g." + randomString(16);
//create the mappers for this new group //create the mappers for this new group
proID2groupID[proID] = groupID; proID2groupID[proID] = groupID;
proID2subdomain[proID] = subdomain; proID2subdomain[proID] = subdomain;
groups[groupID] = {pads: {}}; groups[groupID] = {pads: {}};
} }
//use the generated groupID; //use the generated groupID;
groupID = proID2groupID[proID]; groupID = proID2groupID[proID];
//rename the pad //rename the pad
padId = groupID + "$" + padName; padId = groupID + "$" + padName;
//set the value for this pad in the group //set the value for this pad in the group
groups[groupID].pads[padId] = 1; groups[groupID].pads[padId] = 1;
} }
try try
{ {
var newAuthorIDs = {}; var newAuthorIDs = {};
var oldName2newName = {}; var oldName2newName = {};
//replace the authors with generated authors //replace the authors with generated authors
// we need to do that cause where the original etherpad saves pad local authors, the new (lite) etherpad uses them global // we need to do that cause where the original etherpad saves pad local authors, the new (lite) etherpad uses them global
for(var i in apool.numToAttrib) for(var i in apool.numToAttrib)
{ {
var key = apool.numToAttrib[i][0]; var key = apool.numToAttrib[i][0];
var value = apool.numToAttrib[i][1]; var value = apool.numToAttrib[i][1];
//skip non authors and anonymous authors //skip non authors and anonymous authors
if(key != "author" || value == "") if(key != "author" || value == "")
continue; continue;
//generate new author values //generate new author values
var authorID = "a." + randomString(16); var authorID = "a." + randomString(16);
var authorColorID = authors[i].colorId || Math.floor(Math.random()*32); var authorColorID = authors[i].colorId || Math.floor(Math.random()*32);
var authorName = authors[i].name || null; var authorName = authors[i].name || null;
//overwrite the authorID of the attribute pool //overwrite the authorID of the attribute pool
apool.numToAttrib[i][1] = authorID; apool.numToAttrib[i][1] = authorID;
//write the author to the database //write the author to the database
values["globalAuthor:" + authorID] = {"colorId" : authorColorID, "name": authorName, "timestamp": timestamp}; values["globalAuthor:" + authorID] = {"colorId" : authorColorID, "name": authorName, "timestamp": timestamp};
//save in mappers //save in mappers
newAuthorIDs[i] = authorID; newAuthorIDs[i] = authorID;
oldName2newName[value] = authorID; oldName2newName[value] = authorID;
} }
//save all revisions //save all revisions
for(var i=0;i<changesets.length;i++) for(var i=0;i<changesets.length;i++)
{ {
values["pad:" + padId + ":revs:" + i] = {changeset: changesets[i], values["pad:" + padId + ":revs:" + i] = {changeset: changesets[i],
meta : { meta : {
author: newAuthorIDs[changesetsMeta[i].a], author: newAuthorIDs[changesetsMeta[i].a],
timestamp: changesetsMeta[i].t, timestamp: changesetsMeta[i].t,
atext: changesetsMeta[i].atext || undefined atext: changesetsMeta[i].atext || undefined
}}; }};
} }
//save all chat messages //save all chat messages
for(var i=0;i<chatMessages.length;i++) for(var i=0;i<chatMessages.length;i++)
{ {
values["pad:" + padId + ":chat:" + i] = {"text": chatMessages[i].lineText, values["pad:" + padId + ":chat:" + i] = {"text": chatMessages[i].lineText,
"userId": oldName2newName[chatMessages[i].userId], "userId": oldName2newName[chatMessages[i].userId],
"time": chatMessages[i].time} "time": chatMessages[i].time}
} }
//generate the latest atext //generate the latest atext
var fullAPool = (new AttributePool()).fromJsonable(apool); var fullAPool = (new AttributePool()).fromJsonable(apool);
var keyRev = Math.floor(padmeta.head / padmeta.keyRevInterval) * padmeta.keyRevInterval; var keyRev = Math.floor(padmeta.head / padmeta.keyRevInterval) * padmeta.keyRevInterval;
var atext = changesetsMeta[keyRev].atext; var atext = changesetsMeta[keyRev].atext;
var curRev = keyRev; var curRev = keyRev;
while (curRev < padmeta.head) while (curRev < padmeta.head)
{ {
curRev++; curRev++;
var changeset = changesets[curRev]; var changeset = changesets[curRev];
atext = Changeset.applyToAText(changeset, atext, fullAPool); atext = Changeset.applyToAText(changeset, atext, fullAPool);
} }
values["pad:" + padId] = {atext: atext, values["pad:" + padId] = {atext: atext,
pool: apool, pool: apool,
head: padmeta.head, head: padmeta.head,
chatHead: padmeta.numChatMessages } chatHead: padmeta.numChatMessages }
} }
catch(e) catch(e)
{ {
@ -407,13 +407,13 @@ function convertPad(padId, callback)
callback(); callback();
return; return;
} }
var sql = ""; var sql = "";
for(var key in values) for(var key in values)
{ {
sql+="REPLACE INTO store VALUES (" + etherpadDB.escape(key) + ", " + etherpadDB.escape(JSON.stringify(values[key]))+ ");\n"; sql+="REPLACE INTO store VALUES (" + etherpadDB.escape(key) + ", " + etherpadDB.escape(JSON.stringify(values[key]))+ ");\n";
} }
fs.writeSync(sqlOutput, sql, undefined, "utf-8"); fs.writeSync(sqlOutput, sql, undefined, "utf-8");
callback(); callback();
} }
@ -429,24 +429,24 @@ function parsePage(array, pageStart, offsets, data, json)
{ {
var start = 0; var start = 0;
var lengths = offsets.split(","); var lengths = offsets.split(",");
for(var i=0;i<lengths.length;i++) for(var i=0;i<lengths.length;i++)
{ {
var unitLength = lengths[i]; var unitLength = lengths[i];
//skip empty units //skip empty units
if(unitLength == "") if(unitLength == "")
continue; continue;
//parse the number //parse the number
unitLength = Number(unitLength); unitLength = Number(unitLength);
//cut the unit out of data //cut the unit out of data
var unit = data.substr(start, unitLength); var unit = data.substr(start, unitLength);
//put it into the array //put it into the array
array[pageStart + i] = json ? JSON.parse(unit) : unit; array[pageStart + i] = json ? JSON.parse(unit) : unit;
//update start //update start
start+=unitLength; start+=unitLength;
} }

View file

@ -1,5 +1,5 @@
{ {
"etherpadDB": "etherpadDB":
{ {
"host": "localhost", "host": "localhost",
"port": 3306, "port": 3306,

View file

@ -12,9 +12,9 @@ try:
assert(os.path.exists(dirtydb_input)) assert(os.path.exists(dirtydb_input))
assert(not os.path.exists(dirtydb_output)) assert(not os.path.exists(dirtydb_output))
except: except:
print() print()
print('Usage: %s /path/to/dirty.db' % sys.argv[0]) print('Usage: %s /path/to/dirty.db' % sys.argv[0])
print() print()
print('Note: Will create a file named dirty.db.new in the same folder,') print('Note: Will create a file named dirty.db.new in the same folder,')
print(' please make sure permissions are OK and a file by that') print(' please make sure permissions are OK and a file by that')
print(' name does not exist already. This script works by omitting') print(' name does not exist already. This script works by omitting')

View file

@ -65,7 +65,7 @@ function processIncludes(inputFile, input, cb) {
console.error(includes); console.error(includes);
var incCount = includes.length; var incCount = includes.length;
if (incCount === 0) cb(null, input); if (incCount === 0) cb(null, input);
includes.forEach(function(include) { includes.forEach(function(include) {
var fname = include.replace(/^@include\s+/, ''); var fname = include.replace(/^@include\s+/, '');
if (!fname.match(/\.md$/)) fname += '.md'; if (!fname.match(/\.md$/)) fname += '.md';

View file

@ -8,8 +8,8 @@
ERROR_HANDLING=0 ERROR_HANDLING=0
# Your email address which should receive the error messages # Your email address which should receive the error messages
EMAIL_ADDRESS="no-reply@example.com" EMAIL_ADDRESS="no-reply@example.com"
# Sets the minimum amount of time between the sending of error emails. # Sets the minimum amount of time between the sending of error emails.
# This ensures you do not get spammed during an endless reboot loop # This ensures you do not get spammed during an endless reboot loop
# It's the time in seconds # It's the time in seconds
TIME_BETWEEN_EMAILS=600 # 10 minutes TIME_BETWEEN_EMAILS=600 # 10 minutes
@ -39,7 +39,7 @@ do
if [ ! -f ${LOG} ]; then if [ ! -f ${LOG} ]; then
touch ${LOG} || ( echo "Logfile '${LOG}' is not writeable" && exit 1 ) touch ${LOG} || ( echo "Logfile '${LOG}' is not writeable" && exit 1 )
fi fi
#Check if the file is writeable #Check if the file is writeable
if [ ! -w ${LOG} ]; then if [ ! -w ${LOG} ]; then
echo "Logfile '${LOG}' is not writeable" echo "Logfile '${LOG}' is not writeable"
@ -48,21 +48,21 @@ do
#Start the application #Start the application
bin/run.sh $@ >>${LOG} 2>>${LOG} bin/run.sh $@ >>${LOG} 2>>${LOG}
#Send email #Send email
if [ $ERROR_HANDLING = 1 ]; then if [ $ERROR_HANDLING = 1 ]; then
TIME_NOW=$(date +%s) TIME_NOW=$(date +%s)
TIME_SINCE_LAST_SEND=$(($TIME_NOW - $LAST_EMAIL_SEND)) TIME_SINCE_LAST_SEND=$(($TIME_NOW - $LAST_EMAIL_SEND))
if [ $TIME_SINCE_LAST_SEND -gt $TIME_BETWEEN_EMAILS ]; then if [ $TIME_SINCE_LAST_SEND -gt $TIME_BETWEEN_EMAILS ]; then
printf "Server was restarted at: $(date)\nThe last 50 lines of the log before the error happens:\n $(tail -n 50 ${LOG})" | mail -s "Pad Server was restarted" $EMAIL_ADDRESS printf "Server was restarted at: $(date)\nThe last 50 lines of the log before the error happens:\n $(tail -n 50 ${LOG})" | mail -s "Pad Server was restarted" $EMAIL_ADDRESS
LAST_EMAIL_SEND=$TIME_NOW LAST_EMAIL_SEND=$TIME_NOW
fi fi
fi fi
echo "RESTART!" >>${LOG} echo "RESTART!" >>${LOG}
#Sleep 10 seconds before restart #Sleep 10 seconds before restart
sleep 10 sleep 10
done done

View file

@ -70,11 +70,11 @@ This creates an empty apool. An apool saves which attributes were used during th
``` ```
> apool.fromJsonable({"numToAttrib":{"0":["author","a.kVnWeomPADAT2pn9"],"1":["bold","true"],"2":["italic","true"]},"nextNum":3}); > apool.fromJsonable({"numToAttrib":{"0":["author","a.kVnWeomPADAT2pn9"],"1":["bold","true"],"2":["italic","true"]},"nextNum":3});
> console.log(apool) > console.log(apool)
{ numToAttrib: { numToAttrib:
{ '0': [ 'author', 'a.kVnWeomPADAT2pn9' ], { '0': [ 'author', 'a.kVnWeomPADAT2pn9' ],
'1': [ 'bold', 'true' ], '1': [ 'bold', 'true' ],
'2': [ 'italic', 'true' ] }, '2': [ 'italic', 'true' ] },
attribToNum: attribToNum:
{ 'author,a.kVnWeomPADAT2pn9': 0, { 'author,a.kVnWeomPADAT2pn9': 0,
'bold,true': 1, 'bold,true': 1,
'italic,true': 2 }, 'italic,true': 2 },

View file

@ -62,7 +62,7 @@ Example: `lang=ar` (translates the interface into Arabic)
## rtl ## rtl
* Boolean * Boolean
Default: true Default: true
Displays pad text from right to left. Displays pad text from right to left.

View file

@ -40,7 +40,7 @@ Returns: {SelectButton}
* {String} value - The value of this option * {String} value - The value of this option
* {String} text - the label text used for this option * {String} text - the label text used for this option
* {Object} attributes - any additional html attributes go here (e.g. `data-l10n-id`) * {Object} attributes - any additional html attributes go here (e.g. `data-l10n-id`)
## registerButton(name, item) ## registerButton(name, item)
* {String} name - used to reference the item in the toolbar config in settings.json * {String} name - used to reference the item in the toolbar config in settings.json
* {Button|SelectButton} item - the button to add * {Button|SelectButton} item - the button to add

View file

@ -124,7 +124,7 @@ If your plugin adds or modifies the front end HTML (e.g. adding buttons or chang
## Writing and running front-end tests for your plugin ## Writing and running front-end tests for your plugin
Etherpad allows you to easily create front-end tests for plugins. Etherpad allows you to easily create front-end tests for plugins.
1. Create a new folder 1. Create a new folder
``` ```

View file

@ -460,7 +460,7 @@ Pad.prototype.remove = async function remove() {
// none of the operations except getting the group depended on callbacks // none of the operations except getting the group depended on callbacks
// so the database operations here are just started and then left to // so the database operations here are just started and then left to
// run to completion // run to completion
// is it a group pad? -> delete the entry of this pad in the group // is it a group pad? -> delete the entry of this pad in the group
if (padID.indexOf("$") >= 0) { if (padID.indexOf("$") >= 0) {

View file

@ -39,7 +39,7 @@ function getAllLocales() {
//add core supported languages first //add core supported languages first
extractLangs(npm.root+"/ep_etherpad-lite/locales"); extractLangs(npm.root+"/ep_etherpad-lite/locales");
//add plugins languages (if any) //add plugins languages (if any)
for(var pluginName in plugins) extractLangs(path.join(npm.root, pluginName, 'locales')); for(var pluginName in plugins) extractLangs(path.join(npm.root, pluginName, 'locales'));
@ -94,11 +94,11 @@ exports.expressCreateServer = function(n, args) {
res.status(404).send('Language not available'); res.status(404).send('Language not available');
} }
}) })
args.app.get('/locales.json', function(req, res) { args.app.get('/locales.json', function(req, res) {
res.setHeader('Content-Type', 'application/json; charset=utf-8'); res.setHeader('Content-Type', 'application/json; charset=utf-8');
res.send(localeIndex); res.send(localeIndex);
}) })
} }

View file

@ -163,7 +163,7 @@ td, th {
position: absolute; position: absolute;
top: 0; left: 0; bottom:0; right:0; top: 0; left: 0; bottom:0; right:0;
padding: auto; padding: auto;
background: rgb(255,255,255); background: rgb(255,255,255);
display: none; display: none;
} }

View file

@ -42,7 +42,7 @@ body,
#tbl_context_menu ul .yuimenuitemlabel, #tbl_context_menu ul .yuimenuitemlabel,
.yui-skin-sam .yui-split-button button em:not(.color-picker-button), .yui-skin-sam .yui-split-button button em:not(.color-picker-button),
#yui-picker-panel .button-group .yui-button:first-child button, #yui-picker-panel .button-group .yui-button:first-child button,
#newComment .sidebar-comment input[type=reset], #newComment .sidebar-comment input[type=reset]:hover, #newComment .sidebar-comment input[type=reset], #newComment .sidebar-comment input[type=reset]:hover,
#newComment .sidebar-comment input[type=submit]:hover, #newComment .sidebar-comment input[type=submit]:hover,
.suggestion, .comment-reply-input, .reply-suggestion p:not(.reply-comment-suggest-from-p), .comment-text, .suggestion, .comment-reply-input, .reply-suggestion p:not(.reply-comment-suggest-from-p), .comment-text,
.sidebar-comment textarea, .reply-comment-suggest label, .comment-suggest label, .comment-reply-input .sidebar-comment textarea, .reply-comment-suggest label, .comment-suggest label, .comment-reply-input
@ -53,7 +53,7 @@ body,
.suggestion .comment-suggest-from, .suggestion .comment-suggest-from,
.hyperlink-dialog>.hyperlink-url, .hyperlink-dialog>.hyperlink-url,
.timeslider #padcontent span , .timeslider #padcontent span ,
.exporttype, .timeslider #export > p .exporttype, .timeslider #export > p
{ color: #2E3338 !important; } { color: #2E3338 !important; }
/* MENUS ICONS */ /* MENUS ICONS */
@ -61,7 +61,7 @@ body,
#tbl-menu:before #tbl-menu:before
{ color: #767676 !important; } { color: #767676 !important; }
/* MENU BUTTONS */ /* MENU BUTTONS */
.timeslider #editbar .buttontext .timeslider #editbar .buttontext
{ background-color: #767676 !important; } { background-color: #767676 !important; }
/* PRIMARY BUTTONS */ /* PRIMARY BUTTONS */
@ -74,13 +74,13 @@ body,
.comment-changeTo-approve input[type=submit], .comment-changeTo-approve input[type=submit],
.hyperlink-dialog>.hyperlink-save, .hyperlink-dialog>.hyperlink-save,
#importsubmitinput, #forcereconnect #importsubmitinput, #forcereconnect
{ {
background-color: #64d29b; background-color: #64d29b;
color: white; color: white;
} }
/* PRIMARY COLOR */ /* PRIMARY COLOR */
h1, h1,
#titlelabel, #titlelabel,
.yui-skin-sam .yui-panel .hd, .yui-skin-sam .yui-panel .hd,
p[data-l10n-id="ep_comments_page.comment"], p[data-l10n-id="ep_comments_page.comment"],
@ -88,7 +88,7 @@ p[data-l10n-id="ep_comments_page.comment"],
.stepper, #importmessageabiword, #importmessageabiword > a .stepper, #importmessageabiword, #importmessageabiword > a
{ color: #64d29b; } { color: #64d29b; }
#ui-slider-handle, #playpause_button_icon { #ui-slider-handle, #playpause_button_icon {
background-color: #64d29b; background-color: #64d29b;
} }
.stepper { .stepper {
border-color: #64d29b; border-color: #64d29b;

View file

@ -10,7 +10,7 @@
} }
#chatbox.stickyChat { #chatbox.stickyChat {
width: 193px !important; width: 193px !important;
border: none !important; border: none !important;
} }
@ -32,7 +32,7 @@
#titlelabel, #chatlabel { #titlelabel, #chatlabel {
text-transform: uppercase; text-transform: uppercase;
font-weight: bold; font-weight: bold;
} }
#titlelabel { font-size: 16px; } #titlelabel { font-size: 16px; }
@ -40,7 +40,7 @@
#chattext { #chattext {
top: 45px; top: 45px;
font-size: 13px; font-size: 13px;
bottom: 52px; bottom: 52px;
overflow-y: auto; overflow-y: auto;
padding: 0; padding: 0;
@ -49,13 +49,13 @@
} }
.plugin-ep_author_neat #chattext { .plugin-ep_author_neat #chattext {
padding: 10px; padding: 10px;
} }
.plugin-ep_author_neat #chattext.authorColors p, .plugin-ep_author_neat #chattext.authorColors p,
.plugin-ep_author_neat #chattext.authorColors span { .plugin-ep_author_neat #chattext.authorColors span {
background-color: transparent !important; background-color: transparent !important;
} }
#chattext p b { #chattext p b {
color: #4c4c4c; color: #4c4c4c;
@ -76,7 +76,7 @@
} }
#chatbox.stickyChat #chattext { #chatbox.stickyChat #chattext {
padding: 0px; padding: 0px;
} }
#chatinputbox { #chatinputbox {
@ -85,7 +85,7 @@
#chatinput { #chatinput {
width: calc(100% - 20px); width: calc(100% - 20px);
float: right; float: right;
} }
.plugin-ep_author_neat #chatbox.stickyChat #chattext { .plugin-ep_author_neat #chatbox.stickyChat #chattext {

View file

@ -4,7 +4,7 @@
width: calc(50% - 20px); width: calc(50% - 20px);
} }
#importmessageabiword { #importmessageabiword {
font-style: italic; font-style: italic;
font-size: 13px; font-size: 13px;
} }

View file

@ -19,7 +19,7 @@
border-right: 5px solid transparent; border-right: 5px solid transparent;
} }
#sidedivinner>div { #sidedivinner>div {
line-height: 24px; line-height: 24px;
font-size: 10px !important; font-size: 10px !important;
color: #a0a0a0; color: #a0a0a0;

View file

@ -41,7 +41,7 @@
.toolbar ul li a:hover, .toolbar ul li a:hover,
.toolbar ul li a.selected, .toolbar ul li a.selected,
.toolbar ul li a:focus { .toolbar ul li a:focus {
background: none !important; background: none !important;
border-radius: 0; border-radius: 0;
} }

View file

@ -79,7 +79,7 @@ table#otheruserstable {
bottom: 42px; bottom: 42px;
left: initial; left: initial;
top: initial !important; top: initial !important;
} }
} }
#users.chatAndUsers { #users.chatAndUsers {
@ -87,7 +87,7 @@ table#otheruserstable {
box-shadow: none; box-shadow: none;
border: none !important; border: none !important;
padding: 10px; padding: 10px;
padding-top: 15px; padding-top: 15px;
} }
#users.chatAndUsers #myusernameedit { #users.chatAndUsers #myusernameedit {

View file

@ -9,26 +9,26 @@
#editorcontainer { #editorcontainer {
top: 41px !important; top: 41px !important;
padding-top: 0 !important; padding-top: 0 !important;
} }
#outerdocbody, .timeslider #editorcontainerbox { #outerdocbody, .timeslider #editorcontainerbox {
max-width: 900px; max-width: 900px;
margin: 0 auto; margin: 0 auto;
padding-top: 20px; padding-top: 20px;
} }
#outerdocbody { #outerdocbody {
overflow-y: auto; overflow-y: auto;
position: relative; position: relative;
background-color: transparent; background-color: transparent;
padding-left: 40px; /* space for side div */ padding-left: 40px; /* space for side div */
} }
#outerdocbody.plugin-ep_author_neat { #outerdocbody.plugin-ep_author_neat {
padding-left: 120px; /* more space for sidediv */ padding-left: 120px; /* more space for sidediv */
} }
@media (max-width:600px) { @media (max-width:600px) {
#outerdocbody.plugin-ep_author_neat { padding-left: 0; } #outerdocbody.plugin-ep_author_neat { padding-left: 0; }
#options-linenoscheck { display:none; } #options-linenoscheck { display:none; }
#options-linenoscheck ~ label { display:none; } #options-linenoscheck ~ label { display:none; }
@ -42,16 +42,16 @@
display: block; display: block;
position: relative; position: relative;
left: 0 !important; left: 0 !important;
top: 0; top: 0;
} }
#outerdocbody iframe, .timeslider #editorcontainerbox { #outerdocbody iframe, .timeslider #editorcontainerbox {
padding: 55px; padding: 55px;
box-shadow: 0 0 0 0.5px rgba(209, 209, 209, 0.32), 0 0 7pt 0pt rgba(204, 204, 204, 0.52); box-shadow: 0 0 0 0.5px rgba(209, 209, 209, 0.32), 0 0 7pt 0pt rgba(204, 204, 204, 0.52);
border: 0; border: 0;
border-radius: 5px; border-radius: 5px;
background-color: white; background-color: white;
width: calc(100% - 110px) !important; /* 100% - padding */ width: calc(100% - 110px) !important; /* 100% - padding */
} }
#sidediv { #sidediv {
@ -62,8 +62,8 @@
padding: 0; padding: 0;
} }
#outerdocbody.plugin-ep_author_neat #sidediv { #outerdocbody.plugin-ep_author_neat #sidediv {
right: calc(100% - 113px); right: calc(100% - 113px);
} }
/* Fixs comments_page & author_hover does not take in account the document padding */ /* Fixs comments_page & author_hover does not take in account the document padding */
@ -73,22 +73,22 @@
#outerdocbody.plugin-ep_author_neat .authortooltip{ margin-left: 145px; } #outerdocbody.plugin-ep_author_neat .authortooltip{ margin-left: 145px; }
#outerdocbody.plugin-ep_author_neat .caretindicator{ margin-left: 52px; margin-top: 65px!important;} #outerdocbody.plugin-ep_author_neat .caretindicator{ margin-left: 52px; margin-top: 65px!important;}
@media (max-width:1000px) { @media (max-width:1000px) {
#outerdocbody.plugin-ep_author_neat .authortooltip{ margin-left: 115px; } #outerdocbody.plugin-ep_author_neat .authortooltip{ margin-left: 115px; }
.caretindicator{ margin-left: 13px; } .caretindicator{ margin-left: 13px; }
#outerdocbody.plugin-ep_author_neat .caretindicator{ margin-left: 17px; } #outerdocbody.plugin-ep_author_neat .caretindicator{ margin-left: 17px; }
} }
@media (min-width: 1381px) { @media (min-width: 1381px) {
#outerdocbody.plugin-ep_comments_page { padding-right: 150px; } } #outerdocbody.plugin-ep_comments_page { padding-right: 150px; } }
#outerdocbody.plugin-ep_comments_page #comments { left: calc(100% - 150px) } #outerdocbody.plugin-ep_comments_page #comments { left: calc(100% - 150px) }
@media (max-width: 1380px) { @media (max-width: 1380px) {
#outerdocbody.plugin-ep_comments_page #comments { left: calc(100% - 220px) } #outerdocbody.plugin-ep_comments_page #comments { left: calc(100% - 220px) }
#outerdocbody.plugin-ep_comments_page { padding-right: 220px; } #outerdocbody.plugin-ep_comments_page { padding-right: 220px; }
} }
@media (max-width: 1278px) { @media (max-width: 1278px) {
#outerdocbody.plugin-ep_comments_page #comments { display: none; } #outerdocbody.plugin-ep_comments_page #comments { display: none; }
#outerdocbody.plugin-ep_comments_page { padding-right: 0px; } #outerdocbody.plugin-ep_comments_page { padding-right: 0px; }
} }
@media (max-width:1000px) { @media (max-width:1000px) {
@ -101,17 +101,17 @@
border-radius: 0; border-radius: 0;
width: calc(100% - 40px) !important; /* 100% - padding */ width: calc(100% - 40px) !important; /* 100% - padding */
} }
#sidediv { #sidediv {
top: 20px !important; /* = #outerdocbody iframe padding-top */ top: 20px !important; /* = #outerdocbody iframe padding-top */
} }
.comment-modal, .authortooltip { margin-top: 20px !important; } .comment-modal, .authortooltip { margin-top: 20px !important; }
.caretindicator { margin-top: 0px !important; } .caretindicator { margin-top: 0px !important; }
#outerdocbody.plugin-ep_author_neat .caretindicator { margin-top: 10px !important; } #outerdocbody.plugin-ep_author_neat .caretindicator { margin-top: 10px !important; }
#outerdocbody.plugin-ep_author_neat #sidedivinner>div:before { padding-right: 10px !important; } #outerdocbody.plugin-ep_author_neat #sidedivinner>div:before { padding-right: 10px !important; }
#outerdocbody.plugin-ep_author_neat #sidedivinner.authorColors>div, #outerdocbody.plugin-ep_author_neat #sidedivinner.authorColors>div,
#outerdocbody.plugin-ep_author_neat #sidedivinner.authorColors>div.primary-none, #outerdocbody.plugin-ep_author_neat #sidedivinner.authorColors>div.primary-none,
#outerdocbody.plugin-ep_author_neat #sidedivinner>div { padding-right: 6px!important; } #outerdocbody.plugin-ep_author_neat #sidedivinner>div { padding-right: 6px!important; }
#outerdocbody.plugin-ep_author_neat #sidediv { padding-right: 0 !important; } #outerdocbody.plugin-ep_author_neat #sidediv { padding-right: 0 !important; }
} }
@ -125,7 +125,7 @@
padding: 15px !important; padding: 15px !important;
width: calc(100% - 30px) !important; /* 100% - padding */ width: calc(100% - 30px) !important; /* 100% - padding */
} }
#sidediv { #sidediv {
display: none; display: none;
top: 15px !important; /* = #outerdocbody iframe padding-top */ top: 15px !important; /* = #outerdocbody iframe padding-top */
} }

View file

@ -1,6 +1,6 @@
#innerdocbody, #padcontent { #innerdocbody, #padcontent {
font-size: 15px; font-size: 15px;
line-height: 25px; line-height: 25px;
padding: 0; padding: 0;
} }

View file

@ -5,7 +5,7 @@
} }
@media (max-width:720px) { @media (max-width:720px) {
#pad_title { display: none !important; } #pad_title { display: none !important; }
} }
#edit_title { #edit_title {

View file

@ -6,7 +6,7 @@
background: none !important; background: none !important;
width: 18px !important; width: 18px !important;
padding-left: 2px !important; padding-left: 2px !important;
} }
#tbl-menu:before { #tbl-menu:before {
content: "\F0CE"; content: "\F0CE";
} }
@ -51,7 +51,7 @@
border: none; border: none;
text-align: center; text-align: center;
background-color: transparent; background-color: transparent;
padding-top: 4px; padding-top: 4px;
} }
#tbl_insert .yuimenuitemlabel { text-align: center; } #tbl_insert .yuimenuitemlabel { text-align: center; }

View file

@ -24,7 +24,7 @@
.timeslider #timeslider-top { .timeslider #timeslider-top {
position: relative; position: relative;
border-bottom: 1px solid #e4e4e4; border-bottom: 1px solid #e4e4e4;
} }
.timeslider-bar { background: none; } .timeslider-bar { background: none; }
@ -60,8 +60,8 @@
background-color: transparent; background-color: transparent;
} }
#timeslider, #timeslider-left, #timeslider-right { #timeslider, #timeslider-left, #timeslider-right {
height: 57px; height: 57px;
background-color: transparent; background-color: transparent;
} }
@ -133,7 +133,7 @@
text-align: center; text-align: center;
border-radius: 50%; border-radius: 50%;
height: 25px; height: 25px;
padding-top: 2px; padding-top: 2px;
} }
.timeslider #authorsList .author { .timeslider #authorsList .author {

View file

@ -1,5 +1,5 @@
@media (max-width:600px) { @media (max-width:600px) {
#sidediv { #sidediv {
display: none !important; display: none !important;
} }
} }

View file

@ -1,6 +1,6 @@
html { html {
height: 100%; height: 100%;
} }
body { body {
padding: 0px; padding: 0px;
@ -60,7 +60,7 @@ body {
} }
#mocha h1 a:visited #mocha h1 a:visited
{ {
color: #00E; color: #00E;
} }