diff --git a/Makefile b/Makefile
index 01f30701b..ab720f284 100644
--- a/Makefile
+++ b/Makefile
@@ -1,13 +1,20 @@
-doc_dirs = doc $(wildcard doc/*/)
-outdoc_dirs = out $(addprefix out/,$(doc_dirs))
doc_sources = $(wildcard doc/*/*.md) $(wildcard doc/*.md)
outdoc_files = $(addprefix out/,$(doc_sources:.md=.html))
-docs: $(outdoc_files)
+docassets = $(addprefix out/,$(wildcard doc/_assets/*))
+
+VERSION = $(shell node -e "console.log( require('./src/package.json').version )")
+
+docs: $(outdoc_files) $(docassets)
+
+out/doc/_assets/%: doc/_assets/%
+ mkdir -p $(@D)
+ cp $< $@
out/doc/%.html: doc/%.md
mkdir -p $(@D)
node tools/doc/generate.js --format=html --template=doc/template.html $< > $@
+ cat $@ | sed 's/__VERSION__/${VERSION}/' > $@
clean:
rm -rf out/
diff --git a/doc/_assets/style.css b/doc/_assets/style.css
new file mode 100644
index 000000000..fe1343af4
--- /dev/null
+++ b/doc/_assets/style.css
@@ -0,0 +1,44 @@
+body.apidoc {
+ width: 60%;
+ min-width: 10cm;
+ margin: 0 auto;
+}
+
+#header {
+ background-color: #5a5;
+ padding: 10px;
+ color: #111;
+}
+
+a,
+a:active {
+ color: #272;
+}
+a:focus,
+a:hover {
+ color: #050;
+}
+
+#apicontent a.mark,
+#apicontent a.mark:active {
+ float: right;
+ color: #BBB;
+ font-size: 0.7cm;
+ text-decoration: none;
+}
+#apicontent a.mark:focus,
+#apicontent a.mark:hover {
+ color: #AAA;
+}
+
+#apicontent code {
+ padding: 1px;
+ background-color: #EEE;
+ border-radius: 4px;
+ border: 1px solid #DDD;
+}
+#apicontent pre>code {
+ display: block;
+ overflow: auto;
+ padding: 5px;
+}
\ No newline at end of file
diff --git a/doc/api/api.md b/doc/api/api.md
index 8ab5b3bdc..eb5bb9c9b 100644
--- a/doc/api/api.md
+++ b/doc/api/api.md
@@ -1,6 +1,6 @@
@include embed_parameters
@include http_api
-@include hooks
+@include hooks_overview
@include hooks_client-side
@include hooks_server-side
@include editorInfo
diff --git a/doc/api/hooks.md b/doc/api/hooks_overview.md
similarity index 100%
rename from doc/api/hooks.md
rename to doc/api/hooks_overview.md
diff --git a/doc/template.html b/doc/template.html
index 2eb939872..6416da943 100644
--- a/doc/template.html
+++ b/doc/template.html
@@ -2,12 +2,12 @@
- __SECTION__ Etherpad-Lite Manual & Documentation
-
+ __SECTION__ - Etherpad Lite v__VERSION__ Manual & Documentation
+
diff --git a/src/node/server.js b/src/node/server.js
index b91b0e17c..327fa166f 100755
--- a/src/node/server.js
+++ b/src/node/server.js
@@ -21,31 +21,49 @@
* limitations under the License.
*/
+var log4js = require('log4js')
+ , async = require('async')
+ ;
+
// set up logger
-var log4js = require('log4js');
log4js.replaceConsole();
-var settings = require('./utils/Settings');
-
-//set loglevel
-log4js.setGlobalLogLevel(settings.loglevel);
-
-var db = require('./db/DB');
-var async = require('async');
-var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins");
-var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
+var settings
+ , db
+ , plugins
+ , hooks;
var npm = require("npm/lib/npm.js");
-hooks.plugins = plugins;
-
async.waterfall([
+ // load npm
+ function(callback) {
+ npm.load({}, function(er) {
+ callback(er)
+ })
+ },
+
+ // load everything
+ function(callback) {
+ settings = require('./utils/Settings');
+ db = require('./db/DB');
+ plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins");
+ hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
+ hooks.plugins = plugins;
+
+ //set loglevel
+ log4js.setGlobalLogLevel(settings.loglevel);
+ callback();
+ },
+
//initalize the database
function (callback)
{
db.init(callback);
},
- plugins.update,
+ function(callback) {
+ plugins.update(callback)
+ },
function (callback) {
console.info("Installed plugins: " + plugins.formatPlugins());
diff --git a/src/package.json b/src/package.json
index e4e9b9c35..c3c4968a6 100644
--- a/src/package.json
+++ b/src/package.json
@@ -27,6 +27,7 @@
"jsdom-nocontextifiy" : "0.2.10",
"async-stacktrace" : "0.0.2",
"npm" : "1.1.x",
+ "npm-registry-client" : "0.2.10",
"ejs" : "0.6.1",
"graceful-fs" : "1.1.5",
"slide" : "1.1.3",
diff --git a/src/static/js/pluginfw/installer.js b/src/static/js/pluginfw/installer.js
index e7c6fb809..d668e549e 100644
--- a/src/static/js/pluginfw/installer.js
+++ b/src/static/js/pluginfw/installer.js
@@ -1,7 +1,12 @@
var plugins = require("ep_etherpad-lite/static/js/pluginfw/plugins");
var hooks = require("ep_etherpad-lite/static/js/pluginfw/hooks");
var npm = require("npm");
-var registry = require("npm/lib/utils/npm-registry-client/index.js");
+var RegClient = require("npm-registry-client")
+
+var registry = new RegClient(
+{ registry: "http://registry.npmjs.org"
+, cache: npm.cache }
+);
var withNpm = function (npmfn, final, cb) {
npm.load({}, function (er) {
@@ -72,7 +77,7 @@ exports.search = function(query, cache, cb) {
cb(null, exports.searchCache);
} else {
registry.get(
- "/-/all", null, 600, false, true,
+ "/-/all", 600, false, true,
function (er, data) {
if (er) return cb(er);
exports.searchCache = data;
diff --git a/src/static/js/pluginfw/plugins.js b/src/static/js/pluginfw/plugins.js
index 12ba94a27..e02c1331a 100644
--- a/src/static/js/pluginfw/plugins.js
+++ b/src/static/js/pluginfw/plugins.js
@@ -1,7 +1,5 @@
var npm = require("npm/lib/npm.js");
var readInstalled = require("./read-installed.js");
-var relativize = require("npm/lib/utils/relativize.js");
-var readJson = require("npm/lib/utils/read-json.js");
var path = require("path");
var async = require("async");
var fs = require("fs");
diff --git a/src/static/js/pluginfw/read-installed.js b/src/static/js/pluginfw/read-installed.js
index cc03b3579..800ee32cd 100644
--- a/src/static/js/pluginfw/read-installed.js
+++ b/src/static/js/pluginfw/read-installed.js
@@ -94,8 +94,21 @@ var npm = require("npm/lib/npm.js")
, path = require("path")
, asyncMap = require("slide").asyncMap
, semver = require("semver")
- , readJson = require("npm/lib/utils/read-json.js")
- , log = require("npm/lib/utils/log.js")
+ , log = require("log4js").getLogger('pluginfw')
+
+function readJson(file, callback) {
+ fs.readFile(file, function(er, buf) {
+ if(er) {
+ callback(er);
+ return;
+ }
+ try {
+ callback( null, JSON.parse(buf.toString()) )
+ } catch(er) {
+ callback(er)
+ }
+ })
+}
module.exports = readInstalled
@@ -274,7 +287,7 @@ function findUnmet (obj) {
}
})
- log.verbose([obj._id], "returning")
+ log.debug([obj._id], "returning")
return obj
}
diff --git a/tools/doc/html.js b/tools/doc/html.js
index c52fff70a..700ab18cc 100644
--- a/tools/doc/html.js
+++ b/tools/doc/html.js
@@ -48,7 +48,6 @@ function render(lexed, filename, template, cb) {
template = template.replace(/__FILENAME__/g, filename);
template = template.replace(/__SECTION__/g, section);
- template = template.replace(/__VERSION__/g, process.version);
template = template.replace(/__TOC__/g, toc);
// content has to be the last thing we do with