Merge branch 'develop' into feature/connectivity-toolbar

Conflicts:
	src/templates/pad.html
This commit is contained in:
Marcel Klehr 2012-07-23 11:26:15 +02:00
commit 9d25dcc1f9
7 changed files with 269 additions and 30 deletions

View file

@ -24,6 +24,7 @@ var os = require("os");
var path = require('path');
var argv = require('./Cli').argv;
var npm = require("npm/lib/npm.js");
var vm = require('vm');
/* Root path of the installation */
exports.root = path.normalize(path.join(npm.dir, ".."));
@ -45,6 +46,7 @@ exports.dbType = "dirty";
* This setting is passed with dbType to ueberDB to set up the database
*/
exports.dbSettings = { "filename" : path.join(exports.root, "dirty.db") };
/**
* The default Text of a new pad
*/
@ -102,32 +104,24 @@ exports.abiwordAvailable = function()
// Discover where the settings file lives
var settingsFilename = argv.settings || "settings.json";
if (settingsFilename.charAt(0) != '/') {
settingsFilename = path.normalize(path.join(root, settingsFilename));
}
settingsFilename = path.resolve(path.join(root, settingsFilename));
var settingsStr
var settingsStr;
try{
//read the settings sync
settingsStr = fs.readFileSync(settingsFilename).toString();
} catch(e){
console.warn('No settings file found. Using defaults.');
settingsStr = '{}';
console.warn('No settings file found. Continuing using defaults!');
}
//remove all comments
settingsStr = settingsStr.replace(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/gm,"").replace(/#.*/g,"").replace(/\/\/.*/g,"");
// try to parse the settings
var settings;
try
{
settings = JSON.parse(settingsStr);
try {
if(settingsStr) {
settings = vm.runInContext('exports = '+settingsStr, vm.createContext(), "settings.json");
}
catch(e)
{
console.error("There is a syntax error in your settings.json file");
console.error(e.message);
}catch(e){
console.error('There was an error processing your settings.json file: '+e.message);
process.exit(1);
}
@ -148,8 +142,7 @@ for(var i in settings)
//this setting is unkown, output a warning and throw it away
else
{
console.warn("Unkown Setting: '" + i + "'");
console.warn("This setting doesn't exist or it was removed");
console.warn("Unknown Setting: '" + i + "'. This setting doesn't exist or it was removed");
}
}

View file

@ -23,11 +23,12 @@
var padutils = require('./pad_utils').padutils;
var padcookie = require('./pad_cookie').padcookie;
require('./tinycon');
var chat = (function()
{
var isStuck = false;
var chatMentions = 0;
var title = document.title;
var self = {
show: function ()
{
@ -35,7 +36,7 @@ var chat = (function()
$("#chatbox").show();
self.scrollDown();
chatMentions = 0;
document.title = title;
Tinycon.setBubble(0);
},
stickToScreen: function(fromInitialCall) // Make chat stick to right hand side of screen
{
@ -126,12 +127,9 @@ var chat = (function()
// chat throb stuff -- Just make it throw for twice as long
if(wasMentioned && !alreadyFocused)
{ // If the user was mentioned show for twice as long and flash the browser window
if (chatMentions == 0){
title = document.title;
}
$('#chatthrob').html("<b>"+authorName+"</b>" + ": " + text).show().delay(4000).hide(400);
chatMentions++;
document.title = "("+chatMentions+") " + title;
Tinycon.setBubble(chatMentions);
}
else
{
@ -141,7 +139,7 @@ var chat = (function()
// Clear the chat mentions when the user clicks on the chat input box
$('#chatinput').click(function(){
chatMentions = 0;
document.title = title;
Tinycon.setBubble(0);
});
self.scrollDown();

View file

@ -790,8 +790,6 @@ var pad = {
}, 1000);
}
padsavedrevs.handleIsFullyConnected(isConnected);
// pad.determineSidebarVisibility(isConnected && !isInitialConnect);
pad.determineChatVisibility(isConnected && !isInitialConnect);
pad.determineAuthorshipColorsVisibility();

View file

@ -21,6 +21,7 @@
*/
var padutils = require('./pad_utils').padutils;
var hooks = require('./pluginfw/hooks');
var myUserInfo = {};
@ -529,6 +530,10 @@ var paduserlist = (function()
return;
}
hooks.callAll('userJoinOrUpdate', {
userInfo: info
});
var userData = {};
userData.color = typeof info.colorId == "number" ? clientVars.colorPalette[info.colorId] : info.colorId;
userData.name = info.name;

237
src/static/js/tinycon.js Normal file
View file

@ -0,0 +1,237 @@
/*!
* Tinycon - A small library for manipulating the Favicon
* Tom Moor, http://tommoor.com
* Copyright (c) 2012 Tom Moor
* MIT Licensed
* @version 0.2.6
*/
(function(){
var Tinycon = {};
var currentFavicon = null;
var originalFavicon = null;
var originalTitle = document.title;
var faviconImage = null;
var canvas = null;
var options = {};
var defaults = {
width: 7,
height: 9,
font: '10px arial',
colour: '#ffffff',
background: '#F03D25',
fallback: true
};
var ua = (function () {
var agent = navigator.userAgent.toLowerCase();
// New function has access to 'agent' via closure
return function (browser) {
return agent.indexOf(browser) !== -1;
};
}());
var browser = {
ie: ua('msie'),
chrome: ua('chrome'),
webkit: ua('chrome') || ua('safari'),
safari: ua('safari') && !ua('chrome'),
mozilla: ua('mozilla') && !ua('chrome') && !ua('safari')
};
// private methods
var getFaviconTag = function(){
var links = document.getElementsByTagName('link');
for(var i=0, len=links.length; i < len; i++) {
if ((links[i].getAttribute('rel') || '').match(/\bicon\b/)) {
return links[i];
}
}
return false;
};
var removeFaviconTag = function(){
var links = document.getElementsByTagName('link');
var head = document.getElementsByTagName('head')[0];
for(var i=0, len=links.length; i < len; i++) {
var exists = (typeof(links[i]) !== 'undefined');
if (exists && links[i].getAttribute('rel') === 'icon') {
head.removeChild(links[i]);
}
}
};
var getCurrentFavicon = function(){
if (!originalFavicon || !currentFavicon) {
var tag = getFaviconTag();
originalFavicon = currentFavicon = tag ? tag.getAttribute('href') : '/favicon.ico';
}
return currentFavicon;
};
var getCanvas = function (){
if (!canvas) {
canvas = document.createElement("canvas");
canvas.width = 16;
canvas.height = 16;
}
return canvas;
};
var setFaviconTag = function(url){
removeFaviconTag();
var link = document.createElement('link');
link.type = 'image/x-icon';
link.rel = 'icon';
link.href = url;
document.getElementsByTagName('head')[0].appendChild(link);
};
var log = function(message){
if (window.console) window.console.log(message);
};
var drawFavicon = function(num, colour) {
// fallback to updating the browser title if unsupported
if (!getCanvas().getContext || browser.ie || browser.safari || options.fallback === 'force') {
return updateTitle(num);
}
var context = getCanvas().getContext("2d");
var colour = colour || '#000000';
var num = num || 0;
var src = getCurrentFavicon();
faviconImage = new Image();
faviconImage.onload = function() {
// clear canvas
context.clearRect(0, 0, 16, 16);
// draw original favicon
context.drawImage(faviconImage, 0, 0, faviconImage.width, faviconImage.height, 0, 0, 16, 16);
// draw bubble over the top
if (num > 0) drawBubble(context, num, colour);
// refresh tag in page
refreshFavicon();
};
// allow cross origin resource requests if the image is not a data:uri
// as detailed here: https://github.com/mrdoob/three.js/issues/1305
if (!src.match(/^data/)) {
faviconImage.crossOrigin = 'anonymous';
}
faviconImage.src = src;
};
var updateTitle = function(num) {
if (options.fallback) {
if (num > 0) {
document.title = '('+num+') ' + originalTitle;
} else {
document.title = originalTitle;
}
}
};
var drawBubble = function(context, num, colour) {
// bubble needs to be larger for double digits
var len = (num+"").length-1;
var width = options.width + (6*len);
var w = 16-width;
var h = 16-options.height;
// webkit seems to render fonts lighter than firefox
context.font = (browser.webkit ? 'bold ' : '') + options.font;
context.fillStyle = options.background;
context.strokeStyle = options.background;
context.lineWidth = 1;
// bubble
context.fillRect(w,h,width-1,options.height);
// rounded left
context.beginPath();
context.moveTo(w-0.5,h+1);
context.lineTo(w-0.5,15);
context.stroke();
// rounded right
context.beginPath();
context.moveTo(15.5,h+1);
context.lineTo(15.5,15);
context.stroke();
// bottom shadow
context.beginPath();
context.strokeStyle = "rgba(0,0,0,0.3)";
context.moveTo(w,16);
context.lineTo(15,16);
context.stroke();
// number
context.fillStyle = options.colour;
context.textAlign = "right";
context.textBaseline = "top";
// unfortunately webkit/mozilla are a pixel different in text positioning
context.fillText(num, 15, browser.mozilla ? 7 : 6);
};
var refreshFavicon = function(){
// check support
if (!getCanvas().getContext) return;
setFaviconTag(getCanvas().toDataURL());
};
// public methods
Tinycon.setOptions = function(custom){
options = {};
for(var key in defaults){
options[key] = custom.hasOwnProperty(key) ? custom[key] : defaults[key];
}
return this;
};
Tinycon.setImage = function(url){
currentFavicon = url;
refreshFavicon();
return this;
};
Tinycon.setBubble = function(num, colour){
// validate
if(isNaN(parseFloat(num)) || !isFinite(num)) return log('Bubble must be a number');
drawFavicon(num, colour);
return this;
};
Tinycon.reset = function(){
Tinycon.setImage(originalFavicon);
};
Tinycon.setOptions(defaults);
window.Tinycon = Tinycon;
})();

View file

@ -21,7 +21,7 @@
<h1>Etherpad Lite</h1>
<a href="/admin/plugins/info">Technical information on installed plugins</a>
<a href="plugins/info">Technical information on installed plugins</a>
<div class="separator"></div>
<h2>Installed plugins</h2>

View file

@ -149,6 +149,14 @@
<div id="userlistbuttonarea"></div>
</div>
<div id="editorcontainerbox">
<div id="editorcontainer"></div>
<div id="editorloadingbox">
<p>Loading...</p>
<noscript><strong>Sorry, you have to enable Javascript in order to use this.</strong></noscript>
</div>
</div>
<div id="settings" class="popup">
<h1>Pad settings</h1>
<div class="column">