mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-02-01 03:12:42 +01:00
Merge remote branch 'ether/develop'
This commit is contained in:
commit
0250f8d55c
12 changed files with 77 additions and 39 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
# 1.2.1
|
||||||
|
* Allow ! in urls inside the editor (Not Pad urls)
|
||||||
|
* Allow comments in language files
|
||||||
|
* More languages (Finish, Spanish, Bengali, Dutch) Thanks to TranslateWiki.net team. See https://translatewiki.net/w/i.php?title=Special:MessageGroupStats&group=out-etherpad-lite for more details
|
||||||
|
* Bugfix for IE7/8 issue with a JS error #1186
|
||||||
|
* Bugfix windows package extraction issue and make the .zip file smaller
|
||||||
|
* Bugfix group pad API export
|
||||||
|
* Kristen Stewart is a terrible actress and Twilight sucks.
|
||||||
|
|
||||||
# v1.2
|
# v1.2
|
||||||
* Internationalization / Language / Translation support (i18n) with support for German/French
|
* Internationalization / Language / Translation support (i18n) with support for German/French
|
||||||
* A frontend/client side testing framework and backend build tests
|
* A frontend/client side testing framework and backend build tests
|
||||||
|
|
|
@ -3,7 +3,7 @@ This load tester is extremely useful for testing how many dormant clients can co
|
||||||
TODO:
|
TODO:
|
||||||
Emulate characters being typed into a pad
|
Emulate characters being typed into a pad
|
||||||
|
|
||||||
HOW TO USE (from @mjd75) proper formatting at: https://github.com/Pita/etherpad-lite/issues/360
|
HOW TO USE (from @mjd75) proper formatting at: https://github.com/ether/etherpad-lite/issues/360
|
||||||
|
|
||||||
Server 1:
|
Server 1:
|
||||||
Installed Node.js (etc), EtherPad Lite and MySQL
|
Installed Node.js (etc), EtherPad Lite and MySQL
|
||||||
|
|
|
@ -9,7 +9,7 @@ The API gives another web application control of the pads. The basic functions a
|
||||||
|
|
||||||
The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to etherpad lite. Means: Your web application still has to do authentication, but you can tell etherpad lite via the api, which visitors should get which permissions. This allows etherpad lite to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website.
|
The API is designed in a way, so you can reuse your existing user system with their permissions, and map it to etherpad lite. Means: Your web application still has to do authentication, but you can tell etherpad lite via the api, which visitors should get which permissions. This allows etherpad lite to fit into any web application and extend it with real-time functionality. You can embed the pads via an iframe into your website.
|
||||||
|
|
||||||
Take a look at [HTTP API client libraries](https://github.com/Pita/etherpad-lite/wiki/HTTP-API-client-libraries) to see if a library in your favorite language.
|
Take a look at [HTTP API client libraries](https://github.com/ether/etherpad-lite/wiki/HTTP-API-client-libraries) to see if a library in your favorite language.
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@ exports.createServer = function () {
|
||||||
{
|
{
|
||||||
console.warn("Can't get git version for server header\n" + e.message)
|
console.warn("Can't get git version for server header\n" + e.message)
|
||||||
}
|
}
|
||||||
console.log("Report bugs at https://github.com/Pita/etherpad-lite/issues")
|
console.log("Report bugs at https://github.com/ether/etherpad-lite/issues")
|
||||||
|
|
||||||
serverName = "Etherpad-Lite " + version + " (http://j.mp/ep-lite)";
|
serverName = "Etherpad-Lite " + version + " (http://j.mp/ep-lite)";
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name" : "ep_etherpad-lite",
|
"name" : "ep_etherpad-lite",
|
||||||
"description" : "A Etherpad based on node.js",
|
"description" : "A Etherpad based on node.js",
|
||||||
"homepage" : "https://github.com/Pita/etherpad-lite",
|
"homepage" : "https://github.com/ether/etherpad-lite",
|
||||||
"keywords" : ["etherpad", "realtime", "collaborative", "editor"],
|
"keywords" : ["etherpad", "realtime", "collaborative", "editor"],
|
||||||
"author" : "Peter 'Pita' Martischka <petermartischka@googlemail.com> - Primary Technology Ltd",
|
"author" : "Peter 'Pita' Martischka <petermartischka@googlemail.com> - Primary Technology Ltd",
|
||||||
"contributors" : [
|
"contributors" : [
|
||||||
|
@ -46,5 +46,5 @@
|
||||||
"engines" : { "node" : ">=0.6.0",
|
"engines" : { "node" : ">=0.6.0",
|
||||||
"npm" : ">=1.0"
|
"npm" : ">=1.0"
|
||||||
},
|
},
|
||||||
"version" : "1.2.0"
|
"version" : "1.2.1"
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* 90% of the code is still like in the original Etherpad
|
* 90% of the code is still like in the original Etherpad
|
||||||
* Look at https://github.com/ether/pad/blob/master/infrastructure/ace/www/easysync2.js
|
* Look at https://github.com/ether/pad/blob/master/infrastructure/ace/www/easysync2.js
|
||||||
* You can find a explanation what a attribute pool is here:
|
* You can find a explanation what a attribute pool is here:
|
||||||
* https://github.com/Pita/etherpad-lite/blob/master/doc/easysync/easysync-notes.txt
|
* https://github.com/ether/etherpad-lite/blob/master/doc/easysync/easysync-notes.txt
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3266,7 +3266,7 @@ function Ace2Inner(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//hide the dropdownso
|
//hide the dropdownso
|
||||||
if(window.parent.parent.padeditbar){ // required in case its in an iframe should probably use parent.. See Issue 327 https://github.com/Pita/etherpad-lite/issues/327
|
if(window.parent.parent.padeditbar){ // required in case its in an iframe should probably use parent.. See Issue 327 https://github.com/ether/etherpad-lite/issues/327
|
||||||
window.parent.parent.padeditbar.toggleDropDown("none");
|
window.parent.parent.padeditbar.toggleDropDown("none");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -902,7 +902,7 @@ document.webL10n = (function(window, document, undefined) {
|
||||||
// browser-specific startup
|
// browser-specific startup
|
||||||
if (document.addEventListener) { // modern browsers and IE9+
|
if (document.addEventListener) { // modern browsers and IE9+
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
var lang = document.documentElement.lang || navigator.language;
|
var lang = document.documentElement.lang || navigator.language || navigator.userLanguage || 'en';
|
||||||
loadLocale(lang, translateFragment);
|
loadLocale(lang, translateFragment);
|
||||||
}, false);
|
}, false);
|
||||||
} else if (window.attachEvent) { // IE8 and before (= oldIE)
|
} else if (window.attachEvent) { // IE8 and before (= oldIE)
|
||||||
|
@ -977,7 +977,7 @@ document.webL10n = (function(window, document, undefined) {
|
||||||
// startup for IE<9
|
// startup for IE<9
|
||||||
window.attachEvent('onload', function() {
|
window.attachEvent('onload', function() {
|
||||||
gTextProp = document.body.textContent ? 'textContent' : 'innerText';
|
gTextProp = document.body.textContent ? 'textContent' : 'innerText';
|
||||||
var lang = document.documentElement.lang || window.navigator.userLanguage;
|
var lang = document.documentElement.lang || navigator.language || navigator.userLanguage || 'en';
|
||||||
loadLocale(lang, translateFragment);
|
loadLocale(lang, translateFragment);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -310,7 +310,7 @@ function handshake()
|
||||||
}
|
}
|
||||||
else if(obj.accessStatus == "wrongPassword")
|
else if(obj.accessStatus == "wrongPassword")
|
||||||
{
|
{
|
||||||
$("#editorloadingbox").html("<b>You're password was wrong</b><br>" +
|
$("#editorloadingbox").html("<b>Your password was wrong</b><br>" +
|
||||||
"<input id='passwordinput' type='password' name='password'>"+
|
"<input id='passwordinput' type='password' name='password'>"+
|
||||||
"<button type='button' onclick=\"" + padutils.escapeHtml('require('+JSON.stringify(module.id)+").savePassword()") + "\">ok</button>");
|
"<button type='button' onclick=\"" + padutils.escapeHtml('require('+JSON.stringify(module.id)+").savePassword()") + "\">ok</button>");
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,12 +15,15 @@ body {
|
||||||
#iframe-container {
|
#iframe-container {
|
||||||
width: 50%;
|
width: 50%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
float:right;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#iframe-container iframe {
|
#iframe-container iframe {
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
position:absolute;
|
||||||
|
min-width:500px;
|
||||||
|
max-width:800px;
|
||||||
|
left:50%;
|
||||||
|
width:100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#mocha {
|
#mocha {
|
||||||
|
|
|
@ -21,4 +21,27 @@ describe("urls", function(){
|
||||||
return inner$("div").first().find("a").length === 1;
|
return inner$("div").first().find("a").length === 1;
|
||||||
}, 2000).done(done);
|
}, 2000).done(done);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("when you enter a url containing a !, it becomes clickable and contains the whole URL", function(done) {
|
||||||
|
var inner$ = helper.padInner$;
|
||||||
|
var chrome$ = helper.padChrome$;
|
||||||
|
|
||||||
|
//get the first text element out of the inner iframe
|
||||||
|
var firstTextElement = inner$("div").first();
|
||||||
|
var url = "http://etherpad.org/!foo";
|
||||||
|
|
||||||
|
// simulate key presses to delete content
|
||||||
|
firstTextElement.sendkeys('{selectall}'); // select all
|
||||||
|
firstTextElement.sendkeys('{del}'); // clear the first line
|
||||||
|
firstTextElement.sendkeys(url); // insert a URL
|
||||||
|
|
||||||
|
helper.waitFor(function(){
|
||||||
|
if(inner$("div").first().find("a").length === 1){ // if it contains an A link
|
||||||
|
if(inner$("div").first().find("a")[0].href === url){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}, 2000).done(done);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,10 +1,19 @@
|
||||||
|
function deletecookie(name) {
|
||||||
|
document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:01 GMT;';
|
||||||
|
}
|
||||||
|
|
||||||
describe("Language select and change", function(){
|
describe("Language select and change", function(){
|
||||||
|
// Destroy language cookies
|
||||||
|
deletecookie("language", null);
|
||||||
|
|
||||||
//create a new pad before each test run
|
//create a new pad before each test run
|
||||||
beforeEach(function(cb){
|
beforeEach(function(cb){
|
||||||
helper.newPad(cb);
|
helper.newPad(cb);
|
||||||
this.timeout(60000);
|
this.timeout(60000);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Destroy language cookies
|
||||||
|
|
||||||
it("makes text german", function(done) {
|
it("makes text german", function(done) {
|
||||||
var inner$ = helper.padInner$;
|
var inner$ = helper.padInner$;
|
||||||
var chrome$ = helper.padChrome$;
|
var chrome$ = helper.padChrome$;
|
||||||
|
@ -21,12 +30,9 @@ describe("Language select and change", function(){
|
||||||
$languageoption.attr('selected','selected');
|
$languageoption.attr('selected','selected');
|
||||||
$language.change();
|
$language.change();
|
||||||
|
|
||||||
var localizedEventFired = false;
|
helper.waitFor(function() {
|
||||||
$(chrome$.window).bind('localized', function() {
|
return chrome$(".buttonicon-bold").parent()[0]["title"] = "Fett (Strg-B)";
|
||||||
localizedEventFired = true;
|
|
||||||
})
|
})
|
||||||
|
|
||||||
helper.waitFor(function() { return localizedEventFired;})
|
|
||||||
.done(function(){
|
.done(function(){
|
||||||
//get the value of the bold button
|
//get the value of the bold button
|
||||||
var $boldButton = chrome$(".buttonicon-bold").parent();
|
var $boldButton = chrome$(".buttonicon-bold").parent();
|
||||||
|
@ -56,12 +62,10 @@ describe("Language select and change", function(){
|
||||||
$languageoption.attr('selected','selected');
|
$languageoption.attr('selected','selected');
|
||||||
$language.change();
|
$language.change();
|
||||||
|
|
||||||
var localizedEventFired = false;
|
//get the value of the bold button
|
||||||
$(chrome$.window).bind('localized', function() {
|
var $boldButton = chrome$(".buttonicon-bold").parent();
|
||||||
localizedEventFired = true;
|
|
||||||
})
|
|
||||||
|
|
||||||
helper.waitFor(function() { return localizedEventFired;})
|
helper.waitFor(function() { return $boldButton[0]["title"] != "Fett (Strg-B)";})
|
||||||
.done(function(){
|
.done(function(){
|
||||||
|
|
||||||
//get the value of the bold button
|
//get the value of the bold button
|
||||||
|
@ -78,4 +82,3 @@ describe("Language select and change", function(){
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue