plugin_loader.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. var _ = require('lodash');
  2. var path = require('path');
  3. var util = require('util');
  4. var glob = require('glob');
  5. var app = {};
  6. function PluginLoader(_app) {
  7. var self = this;
  8. // global variables
  9. app = _app;
  10. // class variables
  11. self.plugins = {};
  12. // Try to load global apidoc-plugins (if apidoc is installed locally it tries only local)
  13. this.detectPugins(__dirname);
  14. // Try to load local apidoc-plugins
  15. this.detectPugins( path.join(process.cwd(), '/node_modules') );
  16. if (Object.keys(this.plugins).length === 0) {
  17. app.log.debug('No plugins found.');
  18. }
  19. this.loadPlugins();
  20. }
  21. /**
  22. * Inherit
  23. */
  24. util.inherits(PluginLoader, Object);
  25. /**
  26. * Exports
  27. */
  28. module.exports = PluginLoader;
  29. /**
  30. * Detect modules start with "apidoc-plugin-".
  31. * Search up to root until found a plugin.
  32. */
  33. PluginLoader.prototype.detectPugins = function(dir) {
  34. var self = this;
  35. // Every dir start with "apidoc-plugin-", because for the tests of apidoc-plugin-test.
  36. var plugins;
  37. try {
  38. plugins = glob.sync(dir + '/apidoc-plugin-*')
  39. .concat( glob.sync(dir + '/@*/apidoc-plugin-*') );
  40. } catch (e) {
  41. app.log.warn(e);
  42. return;
  43. }
  44. if (plugins.length === 0) {
  45. dir = path.join(dir, '..');
  46. if (dir === '/' || dir.substr(1) === ':\\') {
  47. return;
  48. }
  49. return this.detectPugins(dir);
  50. }
  51. var offset = dir.length + 1;
  52. plugins.forEach( function(plugin) {
  53. var name = plugin.substr(offset);
  54. var filename = path.relative(__dirname, plugin);
  55. app.log.debug('add plugin: ' + name + ', ' + filename);
  56. self.addPlugin(name, plugin);
  57. });
  58. };
  59. /**
  60. * Add Plugin to plugin list.
  61. */
  62. PluginLoader.prototype.addPlugin = function(name, filename) {
  63. if (this.plugins[name]) {
  64. app.log.debug('overwrite plugin: ' + name + ', ' + this.plugins[name]);
  65. }
  66. this.plugins[name] = filename;
  67. };
  68. /**
  69. * Load and initialize Plugins.
  70. */
  71. PluginLoader.prototype.loadPlugins = function() {
  72. _.forEach(this.plugins, function(filename, name) {
  73. app.log.debug('load plugin: ' + name + ', ' + filename);
  74. var plugin;
  75. try {
  76. plugin = require(filename);
  77. } catch(e) {
  78. }
  79. if (plugin && plugin.init) {
  80. plugin.init(app);
  81. } else {
  82. app.log.debug('Ignored, no init function found.');
  83. }
  84. });
  85. };