diff --git a/src/node/eejs/index.js b/src/node/eejs/index.js
index 90c69e595..2d02a45a6 100644
--- a/src/node/eejs/index.js
+++ b/src/node/eejs/index.js
@@ -23,6 +23,7 @@ var ejs = require("ejs");
var fs = require("fs");
var path = require("path");
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks.js");
+var resolve = require("resolve");
exports.info = {
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.require = function (name, args) {
+exports.require = function (name, args, mod) {
if (args == undefined) args = {};
-
- if ((name.indexOf("./") == 0 || name.indexOf("../") == 0) && exports.info.file_stack.length) {
- name = path.join(path.dirname(exports.info.file_stack[exports.info.file_stack.length-1].path), name);
+
+ var basedir = __dirname;
+ 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.require = require;
diff --git a/src/static/css/admin.css b/src/static/css/admin.css
index 67706fa2f..b2dfc1c5c 100644
--- a/src/static/css/admin.css
+++ b/src/static/css/admin.css
@@ -1,138 +1,123 @@
-body {
- margin: 0;
- height: 100%;
- color: #333;
- font: 14px helvetica, sans-serif;
- background: #ddd;
- background: -webkit-radial-gradient(circle,#aaa,#eee 60%) center fixed;
- background: -moz-radial-gradient(circle,#aaa,#eee 60%) center fixed;
- background: -ms-radial-gradient(circle,#aaa,#eee 60%) center fixed;
- background: -o-radial-gradient(circle,#aaa,#eee 60%) center fixed;
- border-top: 8px solid rgba(51,51,51,.8);
-}
-#wrapper {
- border-top: 1px solid #999;
- margin-top: 160px;
- padding: 15px;
- background: #eee;
- 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;
- box-shadow: 0px 1px 8px rgba(0,0,0,0.3);
- max-width: 1200px;
- margin: auto;
-}
-#inner {
- width: 300px;
- margin: 0 auto;
-}
-#button:hover {
- 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-size: 15px;
-}
-input[type="button"] {
- height:30px;
-}
-input[type="text"] {
- border-radius: 3px;
- box-sizing: border-box;
- -moz-box-sizing: border-box;
- padding: 10px 45px 10px 10px;
- *padding: 0; /* IE7 hack */
- width: 100%;
- outline: none;
- border: none;
-}
-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 {
- border-collapse: collapse;
-}
-td, th {
- border: 1px solid black;
- padding-left: 10px;
- padding-right: 10px;
- padding-top: 2px;
- padding-bottom: 2px;
-}
-.template {
- display: none;
-}
-.dialog {
- display: none;
- position: absolute;
- left: 50%;
- top: 50%;
- width: 700px;
- height: 500px;
- margin-left: -350px;
- margin-top: -250px;
- border: 3px solid #999999;
- background: #eeeeee;
-}
-.dialog .title {
- margin: 0;
- padding: 2px;
- border-bottom: 3px solid #999999;
- font-size: 24px;
- line-height: 24px;
- height: 24px;
- overflow: hidden;
-}
-.dialog .title .close {
- float: right;
-}
-.dialog .history {
- background: #222222;
- color: #eeeeee;
- position: absolute;
- top: 41px;
- bottom: 10px;
- left: 10px;
- right: 10px;
- padding: 2px;
- overflow: auto;
-}
+body {
+ margin: 0;
+ height: 100%;
+ color: #333;
+ font: 14px helvetica, sans-serif;
+ background: #ddd;
+ background: -webkit-radial-gradient(circle,#aaa,#eee 60%) center fixed;
+ background: -moz-radial-gradient(circle,#aaa,#eee 60%) center fixed;
+ background: -ms-radial-gradient(circle,#aaa,#eee 60%) center fixed;
+ background: -o-radial-gradient(circle,#aaa,#eee 60%) center fixed;
+ border-top: 8px solid rgba(51,51,51,.8);
+}
+#wrapper {
+ margin-top: 160px;
+ padding: 15px;
+ background: #fff;
+ opacity: .9;
+ box-shadow: 0px 1px 8px rgba(0,0,0,0.3);
+ max-width: 700px;
+ 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 {
+ width: 300px;
+ margin: 0 auto;
+}
+input {
+ font-weight: bold;
+ font-size: 15px;
+}
+input[type="button"] {
+ 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"] {
+ border-radius: 3px;
+ box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ padding: 10px;
+ *padding: 0; /* IE7 hack */
+ width: 100%;
+ outline: none;
+ border: 1px solid #ddd;
+ margin: 0 0 5px 0;
+ max-width: 500px;
+}
+table {
+ border: 1px solid #ddd;
+ border-radius: 3px;
+ border-spacing: 0;
+ width: 100%;
+ margin: 20px 0;
+}
+table thead tr {
+ background: #eee;
+}
+td, th {
+ padding: 5px;
+}
+.template {
+ display: none;
+}
+.dialog {
+ display: none;
+ position: absolute;
+ left: 50%;
+ top: 50%;
+ width: 700px;
+ height: 500px;
+ margin-left: -350px;
+ margin-top: -250px;
+ border: 3px solid #999;
+ background: #eee;
+}
+.dialog .title {
+ margin: 0;
+ padding: 2px;
+ border-bottom: 3px solid #999;
+ font-size: 24px;
+ line-height: 24px;
+ height: 24px;
+ overflow: hidden;
+}
+.dialog .title .close {
+ float: right;
+ padding: 1px 10px;
+}
+.dialog .history {
+ background: #222;
+ color: #eee;
+ position: absolute;
+ top: 41px;
+ bottom: 10px;
+ left: 10px;
+ right: 10px;
+ padding: 2px;
+ overflow: auto;
+}
\ No newline at end of file
diff --git a/src/static/js/ace.js b/src/static/js/ace.js
index 6ea2938b9..85801d33e 100644
--- a/src/static/js/ace.js
+++ b/src/static/js/ace.js
@@ -167,7 +167,13 @@ require.setGlobalKeyPath("require");\n\
buffer.push(Ace2Editor.EMBEDED[KERNEL_SOURCE]);
buffer.push(KERNEL_BOOT);
buffer.push('<\/script>');
- }
+ } else {
+ file = KERNEL_SOURCE;
+ buffer.push('
-
-
-
-
-
-
- <% if (errors.length) { %>
-
- <% errors.forEach(function (item) { %>
-
<%= item.toString() %>
- <% }) %>
-
- <% } %>
-
-
-
Installed plugins
-
-
-
-
Search for plugins to install
-
-
-
-
..
of
.
-
-
-
-
-
-
-
-