Merge branch 'develop' of https://github.com/Pita/etherpad-lite into develop

This commit is contained in:
johnyma22 2012-04-20 23:13:31 +01:00
commit ee77257636
9 changed files with 420 additions and 394 deletions

View File

@ -23,6 +23,7 @@ var ejs = require("ejs");
var fs = require("fs"); var fs = require("fs");
var path = require("path"); var path = require("path");
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js"); var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js");
var resolve = require("resolve");
exports.info = { exports.info = {
buf_stack: [], buf_stack: [],
@ -91,13 +92,28 @@ exports.inherit = function (name, args) {
exports.info.file_stack[exports.info.file_stack.length-1].inherit.push({name:name, args:args}); exports.info.file_stack[exports.info.file_stack.length-1].inherit.push({name:name, args:args});
} }
exports.require = function (name, args) { exports.require = function (name, args, mod) {
if (args == undefined) args = {}; if (args == undefined) args = {};
if ((name.indexOf("./") == 0 || name.indexOf("../") == 0) && exports.info.file_stack.length) { var basedir = __dirname;
name = path.join(path.dirname(exports.info.file_stack[exports.info.file_stack.length-1].path), name); var paths = [];
if (exports.info.file_stack.length) {
basedir = path.dirname(exports.info.file_stack[exports.info.file_stack.length-1].path);
} }
var ejspath = require.resolve(name) if (mod) {
basedir = path.dirname(mod.filename);
paths = mod.paths;
}
var ejspath = resolve.sync(
name,
{
paths : paths,
basedir : basedir,
extensions : [ '.html', '.ejs' ],
}
)
args.e = exports; args.e = exports;
args.require = require; args.require = require;

View File

@ -11,92 +11,76 @@ body {
border-top: 8px solid rgba(51,51,51,.8); border-top: 8px solid rgba(51,51,51,.8);
} }
#wrapper { #wrapper {
border-top: 1px solid #999;
margin-top: 160px; margin-top: 160px;
padding: 15px; padding: 15px;
background: #eee; background: #fff;
background: -webkit-linear-gradient(#fff,#ccc);
background: -moz-linear-gradient(#fff,#ccc);
background: -ms-linear-gradient(#fff,#ccc);
background: -o-linear-gradient(#fff,#ccc);
opacity: .9; opacity: .9;
box-shadow: 0px 1px 8px rgba(0,0,0,0.3); box-shadow: 0px 1px 8px rgba(0,0,0,0.3);
max-width: 1200px; max-width: 700px;
margin: auto; margin: auto;
border-radius: 0 0 7px 7px;
}
h1 {
font-size: 29px;
}
h2 {
font-size: 24px;
}
.seperator {
margin: 10px 0;
height: 1px;
background: #aaa;
background: -webkit-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff);
background: -moz-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff);
background: -ms-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff);
background: -o-linear-gradient(left, #fff, #aaa 20%, #aaa 80%, #fff);
}
form {
margin-bottom: 0;
} }
#inner { #inner {
width: 300px; width: 300px;
margin: 0 auto; margin: 0 auto;
} }
#button:hover { input {
cursor: pointer;
background: #666;
background: -webkit-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
background: -moz-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
background: -ms-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
background: -o-linear-gradient(#707070,#666666 50%,#5B5B5B 51%,#474747);
}
#button:active {
box-shadow: inset 0 1px 12px rgba(0,0,0,0.9);
background: #444;
}
#label {
text-align: left;
text-shadow: 0 1px 1px #fff;
margin: 16px auto 0;
}
form {
border: 1px solid #bbb;
border-radius: 3px;
position: relative;
}
button, input {
font-weight: bold; font-weight: bold;
font-size: 15px; font-size: 15px;
} }
input[type="button"] { input[type="button"] {
height:30px; padding: 4px 6px;
margin: 0;
}
input[type="button"].do-install, input[type="button"].do-uninstall {
float: right;
width: 100px;
}
input[type="button"]#do-search {
display: block;
} }
input[type="text"] { input[type="text"] {
border-radius: 3px; border-radius: 3px;
box-sizing: border-box; box-sizing: border-box;
-moz-box-sizing: border-box; -moz-box-sizing: border-box;
padding: 10px 45px 10px 10px; padding: 10px;
*padding: 0; /* IE7 hack */ *padding: 0; /* IE7 hack */
width: 100%; width: 100%;
outline: none; outline: none;
border: none; border: 1px solid #ddd;
margin: 0 0 5px 0;
max-width: 500px;
} }
button{
display:block;
}
@media only screen and (min-device-width: 320px) and (max-device-width: 720px) {
body {
background: #bbb;
background: -webkit-linear-gradient(#aaa,#eee 60%) center fixed;
background: -moz-linear-gradient(#aaa,#eee 60%) center fixed;
background: -ms-linear-gradient(#aaa,#eee 60%) center fixed;
}
#wrapper {
margin-top: 0;
}
#inner {
width: 95%;
}
#label {
text-align: center;
}
}
table { table {
border-collapse: collapse; border: 1px solid #ddd;
border-radius: 3px;
border-spacing: 0;
width: 100%;
margin: 20px 0;
}
table thead tr {
background: #eee;
} }
td, th { td, th {
border: 1px solid black; padding: 5px;
padding-left: 10px;
padding-right: 10px;
padding-top: 2px;
padding-bottom: 2px;
} }
.template { .template {
display: none; display: none;
@ -110,13 +94,13 @@ td, th {
height: 500px; height: 500px;
margin-left: -350px; margin-left: -350px;
margin-top: -250px; margin-top: -250px;
border: 3px solid #999999; border: 3px solid #999;
background: #eeeeee; background: #eee;
} }
.dialog .title { .dialog .title {
margin: 0; margin: 0;
padding: 2px; padding: 2px;
border-bottom: 3px solid #999999; border-bottom: 3px solid #999;
font-size: 24px; font-size: 24px;
line-height: 24px; line-height: 24px;
height: 24px; height: 24px;
@ -124,10 +108,11 @@ td, th {
} }
.dialog .title .close { .dialog .title .close {
float: right; float: right;
padding: 1px 10px;
} }
.dialog .history { .dialog .history {
background: #222222; background: #222;
color: #eeeeee; color: #eee;
position: absolute; position: absolute;
top: 41px; top: 41px;
bottom: 10px; bottom: 10px;

View File

@ -167,6 +167,12 @@ require.setGlobalKeyPath("require");\n\
buffer.push(Ace2Editor.EMBEDED[KERNEL_SOURCE]); buffer.push(Ace2Editor.EMBEDED[KERNEL_SOURCE]);
buffer.push(KERNEL_BOOT); buffer.push(KERNEL_BOOT);
buffer.push('<\/script>'); buffer.push('<\/script>');
} else {
file = KERNEL_SOURCE;
buffer.push('<script type="application/javascript" src="' + KERNEL_SOURCE + '"><\/script>');
buffer.push('<script type="text/javascript">');
buffer.push(KERNEL_BOOT);
buffer.push('<\/script>');
} }
} }
function pushScriptsTo(buffer) { function pushScriptsTo(buffer) {

View File

@ -229,6 +229,10 @@ domline.createDomLine = function(nonEmpty, doesWrap, optBrowser, optDocument)
result.node.innerHTML = curHTML; result.node.innerHTML = curHTML;
} }
if (lineClass !== null) result.node.className = lineClass; if (lineClass !== null) result.node.className = lineClass;
hooks.callAll("acePostWriteDomLineHTML", {
node: result.node
});
} }
result.prepareForAdd = writeHTML; result.prepareForAdd = writeHTML;
result.finishUpdate = writeHTML; result.finishUpdate = writeHTML;

View File

@ -182,7 +182,7 @@ var padeditbar = (function()
//hide all modules //hide all modules
if(moduleName == "none") if(moduleName == "none")
{ {
$("#editbar ul#menu_right > li").removeClass("selected"); $(".toolbar ul.menu_right li").removeClass("selected");
for(var i=0;i<modules.length;i++) for(var i=0;i<modules.length;i++)
{ {
//skip the userlist //skip the userlist
@ -201,10 +201,10 @@ var padeditbar = (function()
{ {
var nth_child = indexOf(modules, moduleName) + 1; var nth_child = indexOf(modules, moduleName) + 1;
if (nth_child > 0 && nth_child <= (modules.length-1)) { if (nth_child > 0 && nth_child <= (modules.length-1)) {
$("#editbar ul#menu_right li:not(:nth-child(" + nth_child + "))").removeClass("selected"); $(".toolbar ul.menu_right li:not(:nth-child(" + nth_child + "))").removeClass("selected");
$("#editbar ul#menu_right li:nth-child(" + nth_child + ")").toggleClass("selected"); $(".toolbar ul.menu_right li:nth-child(" + nth_child + ")").toggleClass("selected");
} }
if(modules[modules.length-1] === moduleName) $("#editbar ul#menu_right li").removeClass("selected"); if(modules[modules.length-1] === moduleName) $(".toolbar ul.menu_right li").removeClass("selected");
//hide all modules that are not selected and show the selected one //hide all modules that are not selected and show the selected one
for(var i=0;i<modules.length;i++) for(var i=0;i<modules.length;i++)
{ {

View File

@ -748,13 +748,14 @@ function closeColorPicker(accept)
var newColor = $("#mycolorpickerpreview").css("background-color"); var newColor = $("#mycolorpickerpreview").css("background-color");
var parts = newColor.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/); var parts = newColor.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
// parts now should be ["rgb(0, 70, 255", "0", "70", "255"] // parts now should be ["rgb(0, 70, 255", "0", "70", "255"]
if (parts) {
delete (parts[0]); delete (parts[0]);
for (var i = 1; i <= 3; ++i) { for (var i = 1; i <= 3; ++i) {
parts[i] = parseInt(parts[i]).toString(16); parts[i] = parseInt(parts[i]).toString(16);
if (parts[i].length == 1) parts[i] = '0' + parts[i]; if (parts[i].length == 1) parts[i] = '0' + parts[i];
} }
var newColor = "#" +parts.join(''); // "0070ff" var newColor = "#" +parts.join(''); // "0070ff"
}
myUserInfo.colorId = newColor; myUserInfo.colorId = newColor;
pad.notifyChangeColor(newColor); pad.notifyChangeColor(newColor);
paduserlist.renderMyUserInfo(); paduserlist.renderMyUserInfo();

View File

@ -61,7 +61,7 @@ exports.loadFn = function (path, hookName) {
return fn; return fn;
}; };
exports.extractHooks = function (parts, hook_set_name) { exports.extractHooks = function (parts, hook_set_name, plugins) {
var hooks = {}; var hooks = {};
_.each(parts,function (part) { _.each(parts,function (part) {
_.chain(part[hook_set_name] || {}) _.chain(part[hook_set_name] || {})
@ -69,13 +69,26 @@ exports.extractHooks = function (parts, hook_set_name) {
.each(function (hook_name) { .each(function (hook_name) {
if (hooks[hook_name] === undefined) hooks[hook_name] = []; if (hooks[hook_name] === undefined) hooks[hook_name] = [];
var hook_fn_name = part[hook_set_name][hook_name]; var hook_fn_name = part[hook_set_name][hook_name];
/* On the server side, you can't just
* require("pluginname/whatever") if the plugin is installed as
* a dependency of another plugin! Bah, pesky little details of
* npm... */
if (!exports.isClient) {
hook_fn_name = path.normalize(path.join(path.dirname(exports.plugins[part.plugin].package.path), hook_fn_name));
}
try {
var hook_fn = exports.loadFn(hook_fn_name, hook_name); var hook_fn = exports.loadFn(hook_fn_name, hook_name);
if (!hook_fn) {
throw "Not a function";
}
} catch (exc) {
console.error("Failed to load '" + hook_fn_name + "' for '" + part.full_name + "/" + hook_set_name + "/" + hook_name + "': " + exc.toString())
}
if (hook_fn) { if (hook_fn) {
hooks[hook_name].push({"hook_name": hook_name, "hook_fn": hook_fn, "hook_fn_name": hook_fn_name, "part": part}); hooks[hook_name].push({"hook_name": hook_name, "hook_fn": hook_fn, "hook_fn_name": hook_fn_name, "part": part});
} else {
console.error("Unable to load hook function for " + part.full_name + " for hook " + hook_name + ": " + part.hooks[hook_name]);
} }
}); });
}); });
@ -90,7 +103,7 @@ if (exports.isClient) {
// which appears to fix the issue. // which appears to fix the issue.
var callback = function () {setTimeout(cb, 0);}; var callback = function () {setTimeout(cb, 0);};
jQuery.getJSON('/pluginfw/plugin-definitions.json', function(data) { jQuery.getJSON('../pluginfw/plugin-definitions.json', function(data) {
exports.plugins = data.plugins; exports.plugins = data.plugins;
exports.parts = data.parts; exports.parts = data.parts;
exports.hooks = exports.extractHooks(exports.parts, "client_hooks"); exports.hooks = exports.extractHooks(exports.parts, "client_hooks");

View File

@ -1,7 +1,8 @@
<html> <html>
<head> <head>
<title>Plugin manager</title> <title>Plugin manager</title>
<link href="../../static/css/admin.css" rel="stylesheet" type="text/css" /> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0">
<link rel="stylesheet" href="../../static/css/admin.css">
<script src="../../static/js/jquery.js"></script> <script src="../../static/js/jquery.js"></script>
<script src="../../socket.io/socket.io.js"></script> <script src="../../socket.io/socket.io.js"></script>
<script src="../../static/js/admin/plugins.js"></script> <script src="../../static/js/admin/plugins.js"></script>
@ -18,7 +19,9 @@
<% } %> <% } %>
<h1>Installed plugins</h1> <h1>Etherpad Lite</h1>
<div class="seperator"></div>
<h2>Installed plugins</h2>
<table> <table>
<thead> <thead>
<tr> <tr>
@ -41,9 +44,10 @@
</table> </table>
<div class="paged listing search-results"> <div class="paged listing search-results">
<h1>Search for plugins to install</h1> <div class="seperator"></div>
<h2>Search for plugins to install</h2>
<form> <form>
<input type="text" name="search" value="" id="search-query"> <input type="text" name="search" placeholder="Search term" id="search-query">
<input type="button" value="Search" id="do-search"> <input type="button" value="Search" id="do-search">
</form> </form>
<table> <table>
@ -71,7 +75,6 @@
<input type="button" value=">>" class="do-next-page"> <input type="button" value=">>" class="do-next-page">
</div> </div>
<div id="progress" class="dialog"> <div id="progress" class="dialog">
<h1 class="title"> <h1 class="title">
Please wait: <span class="message"></span> Please wait: <span class="message"></span>

View File

@ -61,19 +61,17 @@
</ul> </ul>
<ul class="menu_right"> <ul class="menu_right">
<% e.begin_block("editbarMenuRight"); %> <% e.begin_block("editbarMenuRight"); %>
<li onClick="window.pad&amp;&amp;pad.editbarClick('savedRevision');return false;">
<a id="settingslink" title="Mark this revision as a saved revision">
<div class="buttonicon buttonicon-savedRevision"></div>
</a>
</li>
<li id="settingslink" onClick="window.pad&amp;&amp;pad.editbarClick('settings');return false;"> <li id="settingslink" onClick="window.pad&amp;&amp;pad.editbarClick('settings');return false;">
<a class="buttonicon buttonicon-settings" id="settingslink" title="Settings of this pad"></a> <a class="buttonicon buttonicon-settings" title="Settings of this pad"></a>
</li> </li>
<li id="importexportlink" onClick="window.pad&amp;&amp;pad.editbarClick('import_export');return false;"> <li id="importexportlink" onClick="window.pad&amp;&amp;pad.editbarClick('import_export');return false;">
<a class="buttonicon buttonicon-import_export" id="exportlink" title="Import/Export from/to different document formats"></a> <a class="buttonicon buttonicon-import_export" title="Import/Export from/to different document formats"></a>
</li> </li>
<li id="embedlink" onClick="window.pad&amp;&amp;pad.editbarClick('embed');return false;"> <li id="embedlink" onClick="window.pad&amp;&amp;pad.editbarClick('embed');return false;">
<a class="buttonicon buttonicon-embed" id="embedlink" title="Share and Embed this pad"></a> <a class="buttonicon buttonicon-embed" title="Share and Embed this pad"></a>
</li>
<li id="revisionlink" onClick="window.pad&amp;&amp;pad.editbarClick('savedRevision');return false;">
<a class="buttonicon buttonicon-savedRevision" title="Mark this revision as a saved revision"></a>
</li> </li>
<li class="separator"></li> <li class="separator"></li>
<li id="timesliderlink" onClick="document.location = document.location.pathname+ '/timeslider'"> <li id="timesliderlink" onClick="document.location = document.location.pathname+ '/timeslider'">