No description
available_plugins/ep_fintest | ||
bin | ||
doc | ||
src | ||
tests/frontend | ||
tools/doc | ||
var | ||
.gitignore | ||
CHANGELOG.md | ||
CONTRIBUTING.md | ||
LICENSE | ||
Makefile | ||
README.plugins | ||
settings.json.template | ||
start.bat |
So, a plugin is an npm package whose name starts with ep_ and that contains a file ep.json require("ep_etherpad-lite/static/js/plugingfw/plugins").update() will use npm to list all installed modules and read their ep.json files. These will contain registrations for hooks which are loaded A hook registration is a pairs of a hook name and a function reference (filename for require() plus function name) require("ep_etherpad-lite/static/js/plugingfw/hooks").callAll("hook_name", {argname:value}) will call all hook functions registered for hook_name That is the basis. Ok, so that was a slight simplification: inside ep.json, hook registrations are grouped into groups called "parts". Parts from all plugins are ordered using a topological sort according to "pre" and "post" pointers to other plugins/parts (just like dependencies, but non-installed plugins are silently ignored). This ordering is honored when you do callAll(hook_name) - hook functions for that hook_name are called in that order Ordering between plugins is undefined, only parts are ordered. A plugin usually has one part, but it van have multiple. This is so that it can insert some hook registration before that of another plugin, and another one after. This is important for e.g. registering URL-handlers for the express webserver, if you have some very generic and some very specific url-regexps So, that's basically it... apart from client-side hooks which works the same way, but uses a separate member of the part (part.client_hooks vs part.hooks), and where the hook function must obviously reside in a file require():able from the client... One thing more: The main etherpad tree is actually a plugin itself, called ep_etherpad-lite, and it has it's own ep.json... was that clear?