mirror of
				https://github.com/ether/etherpad-lite.git
				synced 2025-10-31 00:01:16 +01:00 
			
		
		
		
	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:
		
							parent
							
								
									24abd9ca07
								
							
						
					
					
						commit
						312c72c364
					
				| @ -10,7 +10,7 @@ | ||||
| * contain meaningful and detailed **commit messages** in the form: | ||||
|   ``` | ||||
|   submodule: description | ||||
|    | ||||
| 
 | ||||
|   longer description of the change you have made, eventually mentioning the | ||||
|   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 | ||||
|  * Maintain TODO page - https://github.com/ether/etherpad-lite/wiki/TODO#IMPORTANT_TODOS | ||||
|  * Replying to messages on IRC / The Mailing list / Emails | ||||
|    | ||||
| 
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| # IMPORTANT  | ||||
| # IMPORTANT | ||||
| # Protect against misspelling a var and rm -rf / | ||||
| set -u | ||||
| set -e | ||||
|  | ||||
| @ -11,21 +11,21 @@ if [ -d "../bin" ]; then | ||||
| fi | ||||
| 
 | ||||
| #Is wget installed? | ||||
| hash wget > /dev/null 2>&1 || {  | ||||
| hash wget > /dev/null 2>&1 || { | ||||
|   echo "Please install wget" >&2 | ||||
|   exit 1  | ||||
|   exit 1 | ||||
| } | ||||
| 
 | ||||
| #Is zip installed? | ||||
| hash zip > /dev/null 2>&1 || {  | ||||
| hash zip > /dev/null 2>&1 || { | ||||
|   echo "Please install zip" >&2 | ||||
|   exit 1  | ||||
|   exit 1 | ||||
| } | ||||
| 
 | ||||
| #Is zip installed? | ||||
| hash unzip > /dev/null 2>&1 || {  | ||||
| hash unzip > /dev/null 2>&1 || { | ||||
|   echo "Please install unzip" >&2 | ||||
|   exit 1  | ||||
|   exit 1 | ||||
| } | ||||
| 
 | ||||
| START_FOLDER=$(pwd); | ||||
|  | ||||
							
								
								
									
										138
									
								
								bin/convert.js
									
									
									
									
									
								
							
							
						
						
									
										138
									
								
								bin/convert.js
									
									
									
									
									
								
							| @ -26,10 +26,10 @@ log("open output file..."); | ||||
| var sqlOutput = fs.openSync(sqlOutputFile, "w"); | ||||
| var sql = "SET CHARACTER SET UTF8;\n" + | ||||
|           "CREATE TABLE IF NOT EXISTS `store` ( \n" + | ||||
|           "`key` VARCHAR( 100 ) NOT NULL , \n" +  | ||||
|           "`value` LONGTEXT NOT NULL , \n" +  | ||||
|           "`key` VARCHAR( 100 ) NOT NULL , \n" + | ||||
|           "`value` LONGTEXT NOT NULL , \n" + | ||||
|           "PRIMARY KEY (  `key` ) \n" + | ||||
|           ") ENGINE = INNODB;\n" +  | ||||
|           ") ENGINE = INNODB;\n" + | ||||
|           "START TRANSACTION;\n\n"; | ||||
| fs.writeSync(sqlOutput, sql); | ||||
| log("done"); | ||||
| @ -52,7 +52,7 @@ async.series([ | ||||
|   function(callback) | ||||
|   { | ||||
|     log("get all padIds out of the database..."); | ||||
|      | ||||
| 
 | ||||
|     etherpadDB.query("SELECT ID FROM PAD_META", [], function(err, _padIDs) | ||||
|     { | ||||
|       padIDs = _padIDs; | ||||
| @ -62,9 +62,9 @@ async.series([ | ||||
|   function(callback) | ||||
|   { | ||||
|     log("done"); | ||||
|      | ||||
| 
 | ||||
|     //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) | ||||
|       { | ||||
| @ -72,10 +72,10 @@ async.series([ | ||||
|         callback(err); | ||||
|       }); | ||||
|     }, 100); | ||||
|      | ||||
| 
 | ||||
|     //set the step callback as the queue callback
 | ||||
|     queue.drain = callback; | ||||
|      | ||||
| 
 | ||||
|     //add the padids to the worker queue
 | ||||
|     for(var i=0,length=padIDs.length;i<length;i++) | ||||
|     { | ||||
| @ -85,25 +85,25 @@ async.series([ | ||||
| ], function(err) | ||||
| { | ||||
|   if(err) throw err; | ||||
|    | ||||
| 
 | ||||
|   //write the groups
 | ||||
|   var sql = ""; | ||||
|   for(var proID in proID2groupID) | ||||
|   { | ||||
|     var groupID = proID2groupID[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("mapper2group:subdomain:" + subdomain) + ", " + etherpadDB.escape(groupID)+ ");\n"; | ||||
|   } | ||||
|    | ||||
| 
 | ||||
|   //close transaction
 | ||||
|   sql+="COMMIT;"; | ||||
|    | ||||
| 
 | ||||
|   //end the sql file
 | ||||
|   fs.writeSync(sqlOutput, sql, undefined, "utf-8"); | ||||
|   fs.closeSync(sqlOutput); | ||||
|    | ||||
| 
 | ||||
|   log("finished."); | ||||
|   process.exit(0); | ||||
| }); | ||||
| @ -118,7 +118,7 @@ var padsDone = 0; | ||||
| function incrementPadStats() | ||||
| { | ||||
|   padsDone++; | ||||
|    | ||||
| 
 | ||||
|   if(padsDone%100 == 0) | ||||
|   { | ||||
|     var averageTime = Math.round(padsDone/((Date.now() - startTime)/1000)); | ||||
| @ -149,10 +149,10 @@ function convertPad(padId, callback) | ||||
|         function(callback) | ||||
|         { | ||||
|           var sql = "SELECT * FROM `PAD_CHAT_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_CHAT_META` WHERE ID=?)"; | ||||
|            | ||||
| 
 | ||||
|           etherpadDB.query(sql, [padId], function(err, results) | ||||
|           { | ||||
|             if(!err)  | ||||
|             if(!err) | ||||
|             { | ||||
|               try | ||||
|               { | ||||
| @ -163,7 +163,7 @@ function convertPad(padId, callback) | ||||
|                 } | ||||
|               }catch(e) {err = e} | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             callback(err); | ||||
|           }); | ||||
|         }, | ||||
| @ -171,10 +171,10 @@ function convertPad(padId, callback) | ||||
|         function(callback) | ||||
|         { | ||||
|           var sql = "SELECT * FROM `PAD_REVS_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_REVS_META` WHERE ID=?)"; | ||||
|            | ||||
| 
 | ||||
|           etherpadDB.query(sql, [padId], function(err, results) | ||||
|           { | ||||
|             if(!err)  | ||||
|             if(!err) | ||||
|             { | ||||
|               try | ||||
|               { | ||||
| @ -185,7 +185,7 @@ function convertPad(padId, callback) | ||||
|                 } | ||||
|               }catch(e) {err = e} | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             callback(err); | ||||
|           }); | ||||
|         }, | ||||
| @ -193,10 +193,10 @@ function convertPad(padId, callback) | ||||
|         function(callback) | ||||
|         { | ||||
|           var sql = "SELECT * FROM `PAD_REVMETA_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_REVMETA_META` WHERE ID=?)"; | ||||
|            | ||||
| 
 | ||||
|           etherpadDB.query(sql, [padId], function(err, results) | ||||
|           { | ||||
|             if(!err)  | ||||
|             if(!err) | ||||
|             { | ||||
|               try | ||||
|               { | ||||
| @ -207,7 +207,7 @@ function convertPad(padId, callback) | ||||
|                 } | ||||
|               }catch(e) {err = e} | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             callback(err); | ||||
|           }); | ||||
|         }, | ||||
| @ -215,7 +215,7 @@ function convertPad(padId, callback) | ||||
|         function(callback) | ||||
|         { | ||||
|           var sql = "SELECT `JSON` FROM `PAD_APOOL` WHERE `ID` = ?"; | ||||
|            | ||||
| 
 | ||||
|           etherpadDB.query(sql, [padId], function(err, results) | ||||
|           { | ||||
|             if(!err) | ||||
| @ -225,7 +225,7 @@ function convertPad(padId, callback) | ||||
|                 apool=JSON.parse(results[0].JSON).x; | ||||
|               }catch(e) {err = e} | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             callback(err); | ||||
|           }); | ||||
|         }, | ||||
| @ -233,10 +233,10 @@ function convertPad(padId, callback) | ||||
|         function(callback) | ||||
|         { | ||||
|           var sql = "SELECT * FROM `PAD_AUTHORS_TEXT` WHERE NUMID = (SELECT `NUMID` FROM `PAD_AUTHORS_META` WHERE ID=?)"; | ||||
|            | ||||
| 
 | ||||
|           etherpadDB.query(sql, [padId], function(err, results) | ||||
|           { | ||||
|             if(!err)  | ||||
|             if(!err) | ||||
|             { | ||||
|               try | ||||
|               { | ||||
| @ -247,7 +247,7 @@ function convertPad(padId, callback) | ||||
|                 } | ||||
|               }catch(e) {err = e} | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             callback(err); | ||||
|           }); | ||||
|         }, | ||||
| @ -255,17 +255,17 @@ function convertPad(padId, callback) | ||||
|         function(callback) | ||||
|         { | ||||
|           var sql = "SELECT JSON FROM `PAD_META` WHERE ID=?"; | ||||
|            | ||||
| 
 | ||||
|           etherpadDB.query(sql, [padId], function(err, results) | ||||
|           { | ||||
|             if(!err)  | ||||
|             if(!err) | ||||
|             { | ||||
|               try | ||||
|               { | ||||
|                 padmeta = JSON.parse(results[0].JSON).x; | ||||
|               }catch(e) {err = e} | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             callback(err); | ||||
|           }); | ||||
|         }, | ||||
| @ -278,19 +278,19 @@ function convertPad(padId, callback) | ||||
|             callback(); | ||||
|             return; | ||||
|           } | ||||
|            | ||||
| 
 | ||||
|           //get the proID out of this padID
 | ||||
|           var proID = padId.split("$")[0]; | ||||
|          | ||||
| 
 | ||||
|           var sql = "SELECT subDomain FROM pro_domains WHERE ID = ?"; | ||||
|            | ||||
| 
 | ||||
|           etherpadDB.query(sql, [proID], function(err, results) | ||||
|           { | ||||
|             if(!err) | ||||
|             { | ||||
|               subdomain = results[0].subDomain; | ||||
|             } | ||||
|              | ||||
| 
 | ||||
|             callback(err); | ||||
|           }); | ||||
|         } | ||||
| @ -300,105 +300,105 @@ function convertPad(padId, callback) | ||||
|     { | ||||
|       //saves all values that should be written to the database
 | ||||
|       var values = {}; | ||||
|        | ||||
| 
 | ||||
|       //this is a pro pad, let's convert it to a group pad
 | ||||
|       if(padId.indexOf("$") != -1) | ||||
|       { | ||||
|         var padIdParts = padId.split("$"); | ||||
|         var proID = padIdParts[0]; | ||||
|         var padName = padIdParts[1]; | ||||
|          | ||||
| 
 | ||||
|         var groupID | ||||
|          | ||||
| 
 | ||||
|         //this proID is not converted so far, do it
 | ||||
|         if(proID2groupID[proID] == null) | ||||
|         { | ||||
|           groupID = "g." + randomString(16); | ||||
|            | ||||
| 
 | ||||
|           //create the mappers for this new group
 | ||||
|           proID2groupID[proID] = groupID; | ||||
|           proID2subdomain[proID] = subdomain; | ||||
|           groups[groupID] = {pads: {}}; | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         //use the generated groupID;
 | ||||
|         groupID = proID2groupID[proID]; | ||||
|          | ||||
| 
 | ||||
|         //rename the pad
 | ||||
|         padId = groupID + "$" + padName; | ||||
|          | ||||
| 
 | ||||
|         //set the value for this pad in the group
 | ||||
|         groups[groupID].pads[padId] = 1; | ||||
|       } | ||||
|        | ||||
| 
 | ||||
|       try | ||||
|       { | ||||
|         var newAuthorIDs = {}; | ||||
|         var oldName2newName = {}; | ||||
|          | ||||
| 
 | ||||
|         //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
 | ||||
|         for(var i in apool.numToAttrib) | ||||
|         { | ||||
|           var key = apool.numToAttrib[i][0]; | ||||
|           var value = apool.numToAttrib[i][1]; | ||||
|            | ||||
| 
 | ||||
|           //skip non authors and anonymous authors
 | ||||
|           if(key != "author" || value == "") | ||||
|             continue; | ||||
|              | ||||
| 
 | ||||
|           //generate new author values
 | ||||
|           var authorID = "a." + randomString(16); | ||||
|           var authorColorID = authors[i].colorId || Math.floor(Math.random()*32); | ||||
|           var authorName = authors[i].name || null; | ||||
|            | ||||
| 
 | ||||
|           //overwrite the authorID of the attribute pool
 | ||||
|           apool.numToAttrib[i][1] = authorID; | ||||
|            | ||||
| 
 | ||||
|           //write the author to the database
 | ||||
|           values["globalAuthor:" + authorID] = {"colorId" : authorColorID, "name": authorName, "timestamp": timestamp}; | ||||
|            | ||||
| 
 | ||||
|           //save in mappers
 | ||||
|           newAuthorIDs[i] = authorID; | ||||
|           oldName2newName[value] = authorID; | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         //save all revisions
 | ||||
|         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 : { | ||||
|                                                      author: newAuthorIDs[changesetsMeta[i].a], | ||||
|                                                      timestamp: changesetsMeta[i].t, | ||||
|                                                      atext: changesetsMeta[i].atext || undefined | ||||
|                                                    }}; | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         //save all chat messages
 | ||||
|         for(var i=0;i<chatMessages.length;i++) | ||||
|         { | ||||
|           values["pad:" + padId + ":chat:" + i] = {"text": chatMessages[i].lineText,  | ||||
|                                                    "userId": oldName2newName[chatMessages[i].userId],  | ||||
|           values["pad:" + padId + ":chat:" + i] = {"text": chatMessages[i].lineText, | ||||
|                                                    "userId": oldName2newName[chatMessages[i].userId], | ||||
|                                                    "time": chatMessages[i].time} | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         //generate the latest atext
 | ||||
|         var fullAPool = (new AttributePool()).fromJsonable(apool); | ||||
|         var keyRev = Math.floor(padmeta.head / padmeta.keyRevInterval) * padmeta.keyRevInterval; | ||||
|         var atext = changesetsMeta[keyRev].atext; | ||||
|         var curRev = keyRev; | ||||
|         while (curRev < padmeta.head)  | ||||
|         while (curRev < padmeta.head) | ||||
|         { | ||||
|           curRev++; | ||||
|           var changeset = changesets[curRev]; | ||||
|           atext = Changeset.applyToAText(changeset, atext, fullAPool); | ||||
|         } | ||||
|          | ||||
|         values["pad:" + padId] = {atext: atext,  | ||||
|                                   pool: apool,  | ||||
|                                   head: padmeta.head,  | ||||
| 
 | ||||
|         values["pad:" + padId] = {atext: atext, | ||||
|                                   pool: apool, | ||||
|                                   head: padmeta.head, | ||||
|                                   chatHead: padmeta.numChatMessages } | ||||
|        | ||||
| 
 | ||||
|       } | ||||
|       catch(e) | ||||
|       { | ||||
| @ -407,13 +407,13 @@ function convertPad(padId, callback) | ||||
|         callback(); | ||||
|         return; | ||||
|       } | ||||
|        | ||||
| 
 | ||||
|       var sql = ""; | ||||
|       for(var key in values) | ||||
|       { | ||||
|         sql+="REPLACE INTO store VALUES (" + etherpadDB.escape(key) + ", " + etherpadDB.escape(JSON.stringify(values[key]))+ ");\n"; | ||||
|       } | ||||
|        | ||||
| 
 | ||||
|       fs.writeSync(sqlOutput, sql, undefined, "utf-8"); | ||||
|       callback(); | ||||
|     } | ||||
| @ -429,24 +429,24 @@ function parsePage(array, pageStart, offsets, data, json) | ||||
| { | ||||
|   var start = 0; | ||||
|   var lengths = offsets.split(","); | ||||
|    | ||||
| 
 | ||||
|   for(var i=0;i<lengths.length;i++) | ||||
|   { | ||||
|     var unitLength = lengths[i]; | ||||
|      | ||||
| 
 | ||||
|     //skip empty units
 | ||||
|     if(unitLength == "") | ||||
|       continue; | ||||
|      | ||||
| 
 | ||||
|     //parse the number
 | ||||
|     unitLength = Number(unitLength); | ||||
|        | ||||
| 
 | ||||
|     //cut the unit out of data
 | ||||
|     var unit = data.substr(start, unitLength); | ||||
|      | ||||
| 
 | ||||
|     //put it into the array
 | ||||
|     array[pageStart + i] = json ? JSON.parse(unit) : unit; | ||||
|      | ||||
| 
 | ||||
|     //update start
 | ||||
|     start+=unitLength; | ||||
|   } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| { | ||||
|   "etherpadDB":  | ||||
|   "etherpadDB": | ||||
|   { | ||||
|     "host": "localhost", | ||||
|     "port": 3306, | ||||
|  | ||||
| @ -12,9 +12,9 @@ try: | ||||
|     assert(os.path.exists(dirtydb_input)) | ||||
|     assert(not os.path.exists(dirtydb_output)) | ||||
| except: | ||||
|     print()  | ||||
|     print() | ||||
|     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('      please make sure permissions are OK and a file by that') | ||||
|     print('      name does not exist already. This script works by omitting') | ||||
|  | ||||
| @ -65,7 +65,7 @@ function processIncludes(inputFile, input, cb) { | ||||
|   console.error(includes); | ||||
|   var incCount = includes.length; | ||||
|   if (incCount === 0) cb(null, input); | ||||
|    | ||||
| 
 | ||||
|   includes.forEach(function(include) { | ||||
|     var fname = include.replace(/^@include\s+/, ''); | ||||
|     if (!fname.match(/\.md$/)) fname += '.md'; | ||||
|  | ||||
| @ -8,8 +8,8 @@ | ||||
| ERROR_HANDLING=0 | ||||
| # Your email address which should receive the error messages | ||||
| EMAIL_ADDRESS="no-reply@example.com" | ||||
| # Sets the minimum amount of time between the sending of error emails.  | ||||
| # This ensures you do not get spammed during an endless reboot loop  | ||||
| # Sets the minimum amount of time between the sending of error emails. | ||||
| # This ensures you do not get spammed during an endless reboot loop | ||||
| # It's the time in seconds | ||||
| TIME_BETWEEN_EMAILS=600 # 10 minutes | ||||
| 
 | ||||
| @ -39,7 +39,7 @@ do | ||||
|   if [ ! -f ${LOG} ]; then | ||||
|     touch ${LOG} || ( echo "Logfile '${LOG}' is not writeable" && exit 1 ) | ||||
|   fi | ||||
|    | ||||
| 
 | ||||
|   #Check if the file is writeable | ||||
|   if [ ! -w ${LOG} ]; then | ||||
|     echo "Logfile '${LOG}' is not writeable" | ||||
| @ -48,21 +48,21 @@ do | ||||
| 
 | ||||
|   #Start the application | ||||
|   bin/run.sh $@ >>${LOG} 2>>${LOG} | ||||
|    | ||||
| 
 | ||||
|   #Send email | ||||
|   if [ $ERROR_HANDLING = 1 ]; then | ||||
|     TIME_NOW=$(date +%s) | ||||
|     TIME_SINCE_LAST_SEND=$(($TIME_NOW - $LAST_EMAIL_SEND)) | ||||
|      | ||||
| 
 | ||||
|     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 | ||||
|        | ||||
| 
 | ||||
|       LAST_EMAIL_SEND=$TIME_NOW | ||||
|     fi | ||||
|   fi | ||||
|    | ||||
| 
 | ||||
|   echo "RESTART!" >>${LOG} | ||||
|    | ||||
| 
 | ||||
|   #Sleep 10 seconds before restart | ||||
|   sleep 10 | ||||
| done | ||||
|  | ||||
| @ -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}); | ||||
| > console.log(apool) | ||||
| { numToAttrib:  | ||||
| { numToAttrib: | ||||
|    { '0': [ 'author', 'a.kVnWeomPADAT2pn9' ], | ||||
|      '1': [ 'bold', 'true' ], | ||||
|      '2': [ 'italic', 'true' ] }, | ||||
|   attribToNum:  | ||||
|   attribToNum: | ||||
|    { 'author,a.kVnWeomPADAT2pn9': 0, | ||||
|      'bold,true': 1, | ||||
|      'italic,true': 2 }, | ||||
|  | ||||
| @ -62,7 +62,7 @@ Example: `lang=ar` (translates the interface into Arabic) | ||||
| 
 | ||||
| ## rtl | ||||
|  * Boolean | ||||
|   | ||||
| 
 | ||||
| Default: true | ||||
| Displays pad text from right to left. | ||||
| 
 | ||||
|  | ||||
| @ -40,7 +40,7 @@ Returns: {SelectButton} | ||||
|  * {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 | ||||
| @ -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 | ||||
| 
 | ||||
| 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 | ||||
| ``` | ||||
|  | ||||
| @ -460,7 +460,7 @@ Pad.prototype.remove = async function remove() { | ||||
|   // none of the operations except getting the group depended on callbacks
 | ||||
|   // so the database operations here are just started and then left to
 | ||||
|   // run to completion
 | ||||
|   | ||||
| 
 | ||||
|   // is it a group pad? -> delete the entry of this pad in the group
 | ||||
|   if (padID.indexOf("$") >= 0) { | ||||
| 
 | ||||
|  | ||||
| @ -39,7 +39,7 @@ function getAllLocales() { | ||||
| 
 | ||||
|   //add core supported languages first
 | ||||
|   extractLangs(npm.root+"/ep_etherpad-lite/locales"); | ||||
|    | ||||
| 
 | ||||
|   //add plugins languages (if any)
 | ||||
|   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'); | ||||
|     } | ||||
|   }) | ||||
|    | ||||
| 
 | ||||
|   args.app.get('/locales.json', function(req, res) { | ||||
|     res.setHeader('Content-Type', 'application/json; charset=utf-8'); | ||||
|     res.send(localeIndex); | ||||
|   }) | ||||
|    | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -163,7 +163,7 @@ td, th { | ||||
|   position: absolute; | ||||
|   top: 0; left: 0; bottom:0; right:0; | ||||
|   padding: auto; | ||||
|    | ||||
| 
 | ||||
|   background: rgb(255,255,255); | ||||
|   display: none; | ||||
| } | ||||
|  | ||||
| @ -42,7 +42,7 @@ body, | ||||
| #tbl_context_menu ul .yuimenuitemlabel, | ||||
| .yui-skin-sam .yui-split-button button em:not(.color-picker-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, | ||||
| .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 | ||||
| @ -53,7 +53,7 @@ body, | ||||
| .suggestion .comment-suggest-from, | ||||
| .hyperlink-dialog>.hyperlink-url, | ||||
| .timeslider #padcontent span , | ||||
| .exporttype, .timeslider #export > p  | ||||
| .exporttype, .timeslider #export > p | ||||
| { color: #2E3338 !important; } | ||||
| 
 | ||||
| /* MENUS ICONS */ | ||||
| @ -61,7 +61,7 @@ body, | ||||
| #tbl-menu:before | ||||
| { color: #767676 !important; } | ||||
| /* MENU BUTTONS */ | ||||
| .timeslider #editbar .buttontext  | ||||
| .timeslider #editbar .buttontext | ||||
| { background-color: #767676 !important; } | ||||
| 
 | ||||
| /* PRIMARY BUTTONS */ | ||||
| @ -74,13 +74,13 @@ body, | ||||
| .comment-changeTo-approve input[type=submit], | ||||
| .hyperlink-dialog>.hyperlink-save, | ||||
| #importsubmitinput, #forcereconnect | ||||
| {  | ||||
|   background-color: #64d29b;  | ||||
| { | ||||
|   background-color: #64d29b; | ||||
|   color: white; | ||||
| } | ||||
| 
 | ||||
| /* PRIMARY COLOR */ | ||||
| h1,  | ||||
| h1, | ||||
| #titlelabel, | ||||
| .yui-skin-sam .yui-panel .hd, | ||||
| p[data-l10n-id="ep_comments_page.comment"], | ||||
| @ -88,7 +88,7 @@ p[data-l10n-id="ep_comments_page.comment"], | ||||
| .stepper, #importmessageabiword, #importmessageabiword > a | ||||
| { color: #64d29b; } | ||||
| #ui-slider-handle, #playpause_button_icon { | ||||
|   background-color: #64d29b;  | ||||
|   background-color: #64d29b; | ||||
| } | ||||
| .stepper { | ||||
|   border-color: #64d29b; | ||||
|  | ||||
| @ -10,7 +10,7 @@ | ||||
| } | ||||
| 
 | ||||
| #chatbox.stickyChat { | ||||
|   width: 193px !important;   | ||||
|   width: 193px !important; | ||||
|   border: none !important; | ||||
| } | ||||
| 
 | ||||
| @ -32,7 +32,7 @@ | ||||
| 
 | ||||
| #titlelabel, #chatlabel { | ||||
|   text-transform: uppercase; | ||||
|   font-weight: bold;   | ||||
|   font-weight: bold; | ||||
| } | ||||
| 
 | ||||
| #titlelabel { font-size: 16px; } | ||||
| @ -40,7 +40,7 @@ | ||||
| 
 | ||||
| #chattext { | ||||
|   top: 45px; | ||||
|   font-size: 13px;   | ||||
|   font-size: 13px; | ||||
|   bottom: 52px; | ||||
|   overflow-y: auto; | ||||
|   padding: 0; | ||||
| @ -49,13 +49,13 @@ | ||||
| } | ||||
| 
 | ||||
| .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 { | ||||
|   background-color: transparent !important; | ||||
| }     | ||||
| } | ||||
| 
 | ||||
| #chattext p b { | ||||
|   color: #4c4c4c; | ||||
| @ -76,7 +76,7 @@ | ||||
| } | ||||
| 
 | ||||
| #chatbox.stickyChat #chattext { | ||||
|   padding: 0px;   | ||||
|   padding: 0px; | ||||
| } | ||||
| 
 | ||||
| #chatinputbox { | ||||
| @ -85,7 +85,7 @@ | ||||
| 
 | ||||
| #chatinput { | ||||
|   width: calc(100% - 20px); | ||||
|   float: right;   | ||||
|   float: right; | ||||
| } | ||||
| 
 | ||||
| .plugin-ep_author_neat #chatbox.stickyChat #chattext { | ||||
|  | ||||
| @ -4,7 +4,7 @@ | ||||
|   width: calc(50% - 20px); | ||||
| } | ||||
| 
 | ||||
| #importmessageabiword {  | ||||
| #importmessageabiword { | ||||
|   font-style: italic; | ||||
|   font-size: 13px; | ||||
| } | ||||
|  | ||||
| @ -19,7 +19,7 @@ | ||||
|   border-right: 5px solid transparent; | ||||
| } | ||||
| 
 | ||||
| #sidedivinner>div {   | ||||
| #sidedivinner>div { | ||||
|   line-height: 24px; | ||||
|   font-size: 10px !important; | ||||
|   color: #a0a0a0; | ||||
|  | ||||
| @ -41,7 +41,7 @@ | ||||
| .toolbar ul li a:hover, | ||||
| .toolbar ul li a.selected, | ||||
| .toolbar ul li a:focus { | ||||
|   background: none !important;  | ||||
|   background: none !important; | ||||
|   border-radius: 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -79,7 +79,7 @@ table#otheruserstable { | ||||
|     bottom: 42px; | ||||
|     left: initial; | ||||
|     top: initial !important; | ||||
|   }  | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| #users.chatAndUsers { | ||||
| @ -87,7 +87,7 @@ table#otheruserstable { | ||||
|   box-shadow: none; | ||||
|   border: none !important; | ||||
|   padding: 10px; | ||||
|   padding-top: 15px;   | ||||
|   padding-top: 15px; | ||||
| } | ||||
| 
 | ||||
| #users.chatAndUsers #myusernameedit { | ||||
|  | ||||
| @ -9,26 +9,26 @@ | ||||
| 
 | ||||
| #editorcontainer { | ||||
|   top: 41px !important; | ||||
|   padding-top: 0 !important;   | ||||
|   padding-top: 0 !important; | ||||
| } | ||||
| 
 | ||||
| #outerdocbody, .timeslider #editorcontainerbox {   | ||||
| #outerdocbody, .timeslider #editorcontainerbox { | ||||
|   max-width: 900px; | ||||
|   margin: 0 auto;   | ||||
|   padding-top: 20px;   | ||||
|   margin: 0 auto; | ||||
|   padding-top: 20px; | ||||
| } | ||||
| 
 | ||||
| #outerdocbody { | ||||
|   overflow-y: auto; | ||||
|   position: relative; | ||||
|   background-color: transparent;   | ||||
|   background-color: transparent; | ||||
|   padding-left: 40px; /* space for side div */ | ||||
| } | ||||
| 
 | ||||
| #outerdocbody.plugin-ep_author_neat { | ||||
|   padding-left: 120px; /* more space for sidediv */ | ||||
| } | ||||
| @media (max-width:600px) {  | ||||
| @media (max-width:600px) { | ||||
|   #outerdocbody.plugin-ep_author_neat { padding-left: 0; } | ||||
|   #options-linenoscheck { display:none; } | ||||
|   #options-linenoscheck ~ label { display:none; } | ||||
| @ -42,16 +42,16 @@ | ||||
|   display: block; | ||||
|   position: relative; | ||||
|   left: 0 !important; | ||||
|   top: 0;   | ||||
|   top: 0; | ||||
| } | ||||
| 
 | ||||
| #outerdocbody iframe, .timeslider #editorcontainerbox { | ||||
|   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-radius: 5px; | ||||
|   background-color: white; | ||||
|   width: calc(100% - 110px) !important; /* 100% - padding */   | ||||
|   width: calc(100% - 110px) !important; /* 100% - padding */ | ||||
| } | ||||
| 
 | ||||
| #sidediv { | ||||
| @ -62,8 +62,8 @@ | ||||
|   padding: 0; | ||||
| } | ||||
| 
 | ||||
| #outerdocbody.plugin-ep_author_neat #sidediv {  | ||||
|   right: calc(100% - 113px);  | ||||
| #outerdocbody.plugin-ep_author_neat #sidediv { | ||||
|   right: calc(100% - 113px); | ||||
| } | ||||
| 
 | ||||
| /* 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 .caretindicator{ margin-left: 52px; margin-top: 65px!important;} | ||||
| @media (max-width:1000px) {  | ||||
|   #outerdocbody.plugin-ep_author_neat .authortooltip{ margin-left: 115px; }  | ||||
|   .caretindicator{ margin-left: 13px; }  | ||||
|   #outerdocbody.plugin-ep_author_neat .caretindicator{ margin-left: 17px; }  | ||||
| @media (max-width:1000px) { | ||||
|   #outerdocbody.plugin-ep_author_neat .authortooltip{ margin-left: 115px; } | ||||
|   .caretindicator{ margin-left: 13px; } | ||||
|   #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 #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  { 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  { padding-right: 0px; }  | ||||
|   #outerdocbody.plugin-ep_comments_page  { padding-right: 0px; } | ||||
| } | ||||
| 
 | ||||
| @media (max-width:1000px) { | ||||
| @ -101,17 +101,17 @@ | ||||
|     border-radius: 0; | ||||
|     width: calc(100% - 40px) !important; /* 100% - padding */ | ||||
|   } | ||||
|   #sidediv {  | ||||
|   #sidediv { | ||||
|     top: 20px !important; /* = #outerdocbody iframe padding-top */ | ||||
|   }   | ||||
|   } | ||||
| 
 | ||||
|   .comment-modal, .authortooltip { margin-top: 20px !important; } | ||||
|   .caretindicator { margin-top: 0px !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.authorColors>div,  | ||||
|   #outerdocbody.plugin-ep_author_neat #sidedivinner.authorColors>div.primary-none,  | ||||
|   #outerdocbody.plugin-ep_author_neat #sidedivinner.authorColors>div, | ||||
|   #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 #sidediv { padding-right: 0 !important; } | ||||
| } | ||||
| @ -125,7 +125,7 @@ | ||||
|     padding: 15px !important; | ||||
|     width: calc(100% - 30px) !important; /* 100% - padding */ | ||||
|   } | ||||
|   #sidediv {  | ||||
|   #sidediv { | ||||
|     display: none; | ||||
|     top: 15px !important; /* = #outerdocbody iframe padding-top */ | ||||
|   } | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| #innerdocbody, #padcontent { | ||||
|   font-size: 15px; | ||||
|   line-height: 25px;  | ||||
|   line-height: 25px; | ||||
|   padding: 0; | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -5,7 +5,7 @@ | ||||
| } | ||||
| 
 | ||||
| @media (max-width:720px) { | ||||
|   #pad_title { display: none !important; }   | ||||
|   #pad_title { display: none !important; } | ||||
| } | ||||
| 
 | ||||
| #edit_title { | ||||
|  | ||||
| @ -6,7 +6,7 @@ | ||||
|   background: none !important; | ||||
|   width: 18px !important; | ||||
|   padding-left: 2px !important; | ||||
| }     | ||||
| } | ||||
| #tbl-menu:before { | ||||
|   content: "\F0CE"; | ||||
| } | ||||
| @ -51,7 +51,7 @@ | ||||
|   border: none; | ||||
|   text-align: center; | ||||
|   background-color: transparent; | ||||
|   padding-top: 4px;   | ||||
|   padding-top: 4px; | ||||
| } | ||||
| 
 | ||||
| #tbl_insert .yuimenuitemlabel { text-align: center; } | ||||
|  | ||||
| @ -24,7 +24,7 @@ | ||||
| 
 | ||||
| .timeslider #timeslider-top { | ||||
|   position: relative; | ||||
|   border-bottom: 1px solid #e4e4e4;  | ||||
|   border-bottom: 1px solid #e4e4e4; | ||||
| } | ||||
| 
 | ||||
| .timeslider-bar { background: none; } | ||||
| @ -60,8 +60,8 @@ | ||||
|   background-color: transparent; | ||||
| } | ||||
| 
 | ||||
| #timeslider, #timeslider-left, #timeslider-right {  | ||||
|   height: 57px;  | ||||
| #timeslider, #timeslider-left, #timeslider-right { | ||||
|   height: 57px; | ||||
|   background-color: transparent; | ||||
| } | ||||
| 
 | ||||
| @ -133,7 +133,7 @@ | ||||
|   text-align: center; | ||||
|   border-radius: 50%; | ||||
|   height: 25px; | ||||
|   padding-top: 2px;   | ||||
|   padding-top: 2px; | ||||
| } | ||||
| 
 | ||||
| .timeslider #authorsList .author { | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| @media (max-width:600px) { | ||||
|   #sidediv {  | ||||
|   #sidediv { | ||||
|     display: none !important; | ||||
|   } | ||||
| } | ||||
| @ -1,6 +1,6 @@ | ||||
| html { | ||||
|   height: 100%; | ||||
| }  | ||||
| } | ||||
| 
 | ||||
| body { | ||||
|   padding: 0px; | ||||
| @ -60,7 +60,7 @@ body { | ||||
| } | ||||
| 
 | ||||
| #mocha h1 a:visited | ||||
| {  | ||||
| { | ||||
|   color: #00E; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user