webgen 0.3.8 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (618) hide show
  1. data/ChangeLog +2565 -14
  2. data/README +4 -6
  3. data/Rakefile +207 -89
  4. data/TODO +175 -17
  5. data/VERSION +1 -1
  6. data/bin/webgen +1 -2
  7. data/data/webgen/gallery-creator/default.png +0 -0
  8. data/data/webgen/gallery_styles/default/README +6 -0
  9. data/data/webgen/gallery_styles/default/gallery_gallery.template +38 -0
  10. data/data/webgen/gallery_styles/default/gallery_image.template +30 -0
  11. data/data/webgen/gallery_styles/default/gallery_main.template +18 -0
  12. data/data/webgen/gallery_styles/slides/README +18 -0
  13. data/data/webgen/gallery_styles/slides/collage.rb +334 -0
  14. data/data/webgen/gallery_styles/slides/gallery_gallery.template +62 -0
  15. data/data/webgen/gallery_styles/slides/gallery_image.template +53 -0
  16. data/data/webgen/gallery_styles/slides/gallery_main.template +32 -0
  17. data/data/webgen/resources/images/generated_by_webgen.png +0 -0
  18. data/data/webgen/resources/images/webgen_logo.png +0 -0
  19. data/data/webgen/website_styles/1024px/README +10 -0
  20. data/data/webgen/website_styles/1024px/default.css +188 -0
  21. data/data/webgen/website_styles/1024px/default.template +62 -0
  22. data/data/webgen/website_styles/1024px/images/background.gif +0 -0
  23. data/data/webgen/website_styles/andreas00/README +10 -0
  24. data/data/webgen/website_styles/andreas00/default.css +290 -0
  25. data/data/webgen/website_styles/andreas00/default.template +62 -0
  26. data/data/webgen/website_styles/andreas00/images/bg.gif +0 -0
  27. data/data/webgen/website_styles/andreas00/images/front.jpg +0 -0
  28. data/data/webgen/website_styles/andreas00/images/menubg.gif +0 -0
  29. data/data/webgen/website_styles/andreas00/images/menubg2.gif +0 -0
  30. data/data/webgen/website_styles/andreas01/README +11 -0
  31. data/data/webgen/website_styles/andreas01/default.css +310 -0
  32. data/data/webgen/website_styles/andreas01/default.template +63 -0
  33. data/data/webgen/website_styles/andreas01/images/bg.gif +0 -0
  34. data/data/webgen/website_styles/andreas01/images/front.jpg +0 -0
  35. data/data/webgen/website_styles/andreas01/print.css +35 -0
  36. data/data/webgen/website_styles/andreas03/README +11 -0
  37. data/data/webgen/website_styles/andreas03/default.css +223 -0
  38. data/data/webgen/website_styles/andreas03/default.template +60 -0
  39. data/data/webgen/website_styles/andreas03/images/bodybg.png +0 -0
  40. data/data/webgen/website_styles/andreas03/images/contbg.png +0 -0
  41. data/data/webgen/website_styles/andreas03/images/footerbg.png +0 -0
  42. data/data/webgen/website_styles/andreas03/images/gradient1.png +0 -0
  43. data/data/webgen/website_styles/andreas03/images/gradient2.png +0 -0
  44. data/data/webgen/website_styles/andreas04/README +12 -0
  45. data/data/webgen/website_styles/andreas04/default.css +290 -0
  46. data/data/webgen/website_styles/andreas04/default.template +83 -0
  47. data/data/webgen/website_styles/andreas04/images/blinkarrow.gif +0 -0
  48. data/data/webgen/website_styles/andreas04/images/bodybg.png +0 -0
  49. data/data/webgen/website_styles/andreas04/images/contentbg.png +0 -0
  50. data/data/webgen/website_styles/andreas04/images/entrybg.png +0 -0
  51. data/data/webgen/website_styles/andreas04/images/flash.gif +0 -0
  52. data/data/webgen/website_styles/andreas04/images/flash2.gif +0 -0
  53. data/data/webgen/website_styles/andreas04/images/globe.gif +0 -0
  54. data/data/webgen/website_styles/andreas04/images/globebottom.gif +0 -0
  55. data/data/webgen/website_styles/andreas04/images/linkarrow.gif +0 -0
  56. data/data/webgen/website_styles/andreas04/images/menuhover.png +0 -0
  57. data/data/webgen/website_styles/andreas05/README +11 -0
  58. data/data/webgen/website_styles/andreas05/default.css +33 -0
  59. data/data/webgen/website_styles/andreas05/default.template +42 -0
  60. data/data/webgen/website_styles/andreas05/images/bodybg.gif +0 -0
  61. data/data/webgen/website_styles/andreas05/images/front.png +0 -0
  62. data/data/webgen/website_styles/andreas06/README +11 -0
  63. data/data/webgen/website_styles/andreas06/default.css +353 -0
  64. data/data/webgen/website_styles/andreas06/default.template +72 -0
  65. data/data/webgen/website_styles/andreas06/images/bodybg.gif +0 -0
  66. data/data/webgen/website_styles/andreas06/images/boxbg.gif +0 -0
  67. data/data/webgen/website_styles/andreas06/images/greypx.gif +0 -0
  68. data/data/webgen/website_styles/andreas06/images/header.jpg +0 -0
  69. data/data/webgen/website_styles/andreas06/images/innerbg.gif +0 -0
  70. data/data/webgen/website_styles/andreas06/images/leaves.jpg +0 -0
  71. data/data/webgen/website_styles/andreas06/images/tabs.gif +0 -0
  72. data/data/webgen/website_styles/andreas07/README +12 -0
  73. data/data/webgen/website_styles/andreas07/browserfix.css +7 -0
  74. data/data/webgen/website_styles/andreas07/default.css +92 -0
  75. data/data/webgen/website_styles/andreas07/default.template +44 -0
  76. data/data/webgen/website_styles/andreas07/images/bodybg.gif +0 -0
  77. data/data/webgen/website_styles/andreas07/images/sidebarbg.gif +0 -0
  78. data/data/webgen/website_styles/andreas08/README +11 -0
  79. data/data/webgen/website_styles/andreas08/default.css +224 -0
  80. data/data/webgen/website_styles/andreas08/default.template +53 -0
  81. data/data/webgen/website_styles/andreas09/README +11 -0
  82. data/data/webgen/website_styles/andreas09/default.css +308 -0
  83. data/data/webgen/website_styles/andreas09/default.template +70 -0
  84. data/data/webgen/website_styles/andreas09/images/bodybg-black.jpg +0 -0
  85. data/data/webgen/website_styles/andreas09/images/bodybg-green.jpg +0 -0
  86. data/data/webgen/website_styles/andreas09/images/bodybg-orange.jpg +0 -0
  87. data/data/webgen/website_styles/andreas09/images/bodybg-purple.jpg +0 -0
  88. data/data/webgen/website_styles/andreas09/images/bodybg-red.jpg +0 -0
  89. data/data/webgen/website_styles/andreas09/images/bodybg.jpg +0 -0
  90. data/data/webgen/website_styles/andreas09/images/footerbg.jpg +0 -0
  91. data/data/webgen/website_styles/andreas09/images/menuhover-black.jpg +0 -0
  92. data/data/webgen/website_styles/andreas09/images/menuhover-green.jpg +0 -0
  93. data/data/webgen/website_styles/andreas09/images/menuhover-orange.jpg +0 -0
  94. data/data/webgen/website_styles/andreas09/images/menuhover-purple.jpg +0 -0
  95. data/data/webgen/website_styles/andreas09/images/menuhover-red.jpg +0 -0
  96. data/data/webgen/website_styles/andreas09/images/menuhover.jpg +0 -0
  97. data/data/webgen/website_styles/default/README +6 -0
  98. data/data/webgen/website_styles/default/default.css +1 -1
  99. data/data/webgen/website_styles/default/default.template +9 -3
  100. data/data/webgen/website_styles/plain/README +12 -0
  101. data/data/webgen/website_styles/plain/default.css +244 -0
  102. data/data/webgen/website_styles/plain/default.template +63 -0
  103. data/data/webgen/website_styles/plain/images/a_hover.jpg +0 -0
  104. data/data/webgen/website_styles/plain/images/desc.jpg +0 -0
  105. data/data/webgen/website_styles/plain/images/li.gif +0 -0
  106. data/data/webgen/website_styles/plain/images/mainbar.jpg +0 -0
  107. data/data/webgen/website_styles/plain/images/menu.jpg +0 -0
  108. data/data/webgen/website_styles/plain/images/submenua.gif +0 -0
  109. data/data/webgen/website_styles/plain/images/submenua_hover.jpg +0 -0
  110. data/data/webgen/website_templates/default/README +7 -5
  111. data/data/webgen/website_templates/personal_hp/README +7 -5
  112. data/data/webgen/website_templates/project/README +8 -6
  113. data/doc/config.yaml +2 -2
  114. data/doc/examples/website_styles/1024px/README +9 -0
  115. data/doc/examples/website_styles/1024px/config.yaml +2 -0
  116. data/doc/examples/website_styles/1024px/src/about.page +12 -0
  117. data/doc/examples/website_styles/1024px/src/default.css +188 -0
  118. data/doc/examples/website_styles/1024px/src/default.template +62 -0
  119. data/doc/examples/website_styles/1024px/src/download.page +15 -0
  120. data/doc/examples/website_styles/1024px/src/features.page +8 -0
  121. data/doc/examples/website_styles/1024px/src/images/background.gif +0 -0
  122. data/doc/examples/website_styles/1024px/src/index.page +9 -0
  123. data/doc/examples/website_styles/1024px/src/screenshots.page +18 -0
  124. data/doc/examples/website_styles/andreas00/README +9 -0
  125. data/doc/examples/website_styles/andreas00/config.yaml +2 -0
  126. data/doc/examples/website_styles/andreas00/src/about.page +12 -0
  127. data/doc/examples/website_styles/andreas00/src/default.css +290 -0
  128. data/doc/examples/website_styles/andreas00/src/default.template +62 -0
  129. data/doc/examples/website_styles/andreas00/src/download.page +15 -0
  130. data/doc/examples/website_styles/andreas00/src/features.page +8 -0
  131. data/doc/examples/website_styles/andreas00/src/images/bg.gif +0 -0
  132. data/doc/examples/website_styles/andreas00/src/images/front.jpg +0 -0
  133. data/doc/examples/website_styles/andreas00/src/images/menubg.gif +0 -0
  134. data/doc/examples/website_styles/andreas00/src/images/menubg2.gif +0 -0
  135. data/doc/examples/website_styles/andreas00/src/index.page +9 -0
  136. data/doc/examples/website_styles/andreas00/src/screenshots.page +18 -0
  137. data/doc/examples/website_styles/andreas01/README +9 -0
  138. data/doc/examples/website_styles/andreas01/config.yaml +2 -0
  139. data/doc/examples/website_styles/andreas01/src/about.page +12 -0
  140. data/doc/examples/website_styles/andreas01/src/default.css +310 -0
  141. data/doc/examples/website_styles/andreas01/src/default.template +63 -0
  142. data/doc/examples/website_styles/andreas01/src/download.page +15 -0
  143. data/doc/examples/website_styles/andreas01/src/features.page +8 -0
  144. data/doc/examples/website_styles/andreas01/src/images/bg.gif +0 -0
  145. data/doc/examples/website_styles/andreas01/src/images/front.jpg +0 -0
  146. data/doc/examples/website_styles/andreas01/src/index.page +9 -0
  147. data/doc/examples/website_styles/andreas01/src/print.css +35 -0
  148. data/doc/examples/website_styles/andreas01/src/screenshots.page +18 -0
  149. data/doc/examples/website_styles/andreas03/README +9 -0
  150. data/doc/examples/website_styles/andreas03/config.yaml +2 -0
  151. data/doc/examples/website_styles/andreas03/src/about.page +12 -0
  152. data/doc/examples/website_styles/andreas03/src/default.css +223 -0
  153. data/doc/examples/website_styles/andreas03/src/default.template +60 -0
  154. data/doc/examples/website_styles/andreas03/src/download.page +15 -0
  155. data/doc/examples/website_styles/andreas03/src/features.page +8 -0
  156. data/doc/examples/website_styles/andreas03/src/images/bodybg.png +0 -0
  157. data/doc/examples/website_styles/andreas03/src/images/contbg.png +0 -0
  158. data/doc/examples/website_styles/andreas03/src/images/footerbg.png +0 -0
  159. data/doc/examples/website_styles/andreas03/src/images/gradient1.png +0 -0
  160. data/doc/examples/website_styles/andreas03/src/images/gradient2.png +0 -0
  161. data/doc/examples/website_styles/andreas03/src/index.page +9 -0
  162. data/doc/examples/website_styles/andreas03/src/screenshots.page +18 -0
  163. data/doc/examples/website_styles/andreas04/README +9 -0
  164. data/doc/examples/website_styles/andreas04/config.yaml +2 -0
  165. data/doc/examples/website_styles/andreas04/src/about.page +12 -0
  166. data/doc/examples/website_styles/andreas04/src/default.css +290 -0
  167. data/doc/examples/website_styles/andreas04/src/default.template +83 -0
  168. data/doc/examples/website_styles/andreas04/src/download.page +15 -0
  169. data/doc/examples/website_styles/andreas04/src/features.page +8 -0
  170. data/doc/examples/website_styles/andreas04/src/images/blinkarrow.gif +0 -0
  171. data/doc/examples/website_styles/andreas04/src/images/bodybg.png +0 -0
  172. data/doc/examples/website_styles/andreas04/src/images/contentbg.png +0 -0
  173. data/doc/examples/website_styles/andreas04/src/images/entrybg.png +0 -0
  174. data/doc/examples/website_styles/andreas04/src/images/flash.gif +0 -0
  175. data/doc/examples/website_styles/andreas04/src/images/flash2.gif +0 -0
  176. data/doc/examples/website_styles/andreas04/src/images/globe.gif +0 -0
  177. data/doc/examples/website_styles/andreas04/src/images/globebottom.gif +0 -0
  178. data/doc/examples/website_styles/andreas04/src/images/linkarrow.gif +0 -0
  179. data/doc/examples/website_styles/andreas04/src/images/menuhover.png +0 -0
  180. data/doc/examples/website_styles/andreas04/src/index.page +9 -0
  181. data/doc/examples/website_styles/andreas04/src/screenshots.page +18 -0
  182. data/doc/examples/website_styles/andreas05/README +9 -0
  183. data/doc/examples/website_styles/andreas05/config.yaml +2 -0
  184. data/doc/examples/website_styles/andreas05/src/about.page +12 -0
  185. data/doc/examples/website_styles/andreas05/src/default.css +33 -0
  186. data/doc/examples/website_styles/andreas05/src/default.template +42 -0
  187. data/doc/examples/website_styles/andreas05/src/download.page +15 -0
  188. data/doc/examples/website_styles/andreas05/src/features.page +8 -0
  189. data/doc/examples/website_styles/andreas05/src/images/bodybg.gif +0 -0
  190. data/doc/examples/website_styles/andreas05/src/images/front.png +0 -0
  191. data/doc/examples/website_styles/andreas05/src/index.page +9 -0
  192. data/doc/examples/website_styles/andreas05/src/screenshots.page +18 -0
  193. data/doc/examples/website_styles/andreas06/README +9 -0
  194. data/doc/examples/website_styles/andreas06/config.yaml +2 -0
  195. data/doc/examples/website_styles/andreas06/src/about.page +12 -0
  196. data/doc/examples/website_styles/andreas06/src/default.css +353 -0
  197. data/doc/examples/website_styles/andreas06/src/default.template +72 -0
  198. data/doc/examples/website_styles/andreas06/src/download.page +15 -0
  199. data/doc/examples/website_styles/andreas06/src/features.page +8 -0
  200. data/doc/examples/website_styles/andreas06/src/images/bodybg.gif +0 -0
  201. data/doc/examples/website_styles/andreas06/src/images/boxbg.gif +0 -0
  202. data/doc/examples/website_styles/andreas06/src/images/greypx.gif +0 -0
  203. data/doc/examples/website_styles/andreas06/src/images/header.jpg +0 -0
  204. data/doc/examples/website_styles/andreas06/src/images/innerbg.gif +0 -0
  205. data/doc/examples/website_styles/andreas06/src/images/leaves.jpg +0 -0
  206. data/doc/examples/website_styles/andreas06/src/images/tabs.gif +0 -0
  207. data/doc/examples/website_styles/andreas06/src/index.page +9 -0
  208. data/doc/examples/website_styles/andreas06/src/screenshots.page +18 -0
  209. data/doc/examples/website_styles/andreas07/README +9 -0
  210. data/doc/examples/website_styles/andreas07/config.yaml +2 -0
  211. data/doc/examples/website_styles/andreas07/src/about.page +12 -0
  212. data/doc/examples/website_styles/andreas07/src/browserfix.css +7 -0
  213. data/doc/examples/website_styles/andreas07/src/default.css +92 -0
  214. data/doc/examples/website_styles/andreas07/src/default.template +44 -0
  215. data/doc/examples/website_styles/andreas07/src/download.page +15 -0
  216. data/doc/examples/website_styles/andreas07/src/features.page +8 -0
  217. data/doc/examples/website_styles/andreas07/src/images/bodybg.gif +0 -0
  218. data/doc/examples/website_styles/andreas07/src/images/sidebarbg.gif +0 -0
  219. data/doc/examples/website_styles/andreas07/src/index.page +9 -0
  220. data/doc/examples/website_styles/andreas07/src/screenshots.page +18 -0
  221. data/doc/examples/website_styles/andreas08/README +9 -0
  222. data/doc/examples/website_styles/andreas08/config.yaml +2 -0
  223. data/doc/examples/website_styles/andreas08/src/about.page +12 -0
  224. data/doc/examples/website_styles/andreas08/src/default.css +224 -0
  225. data/doc/examples/website_styles/andreas08/src/default.template +53 -0
  226. data/doc/examples/website_styles/andreas08/src/download.page +15 -0
  227. data/doc/examples/website_styles/andreas08/src/features.page +8 -0
  228. data/doc/examples/website_styles/andreas08/src/index.page +9 -0
  229. data/doc/examples/website_styles/andreas08/src/screenshots.page +18 -0
  230. data/doc/examples/website_styles/andreas09/README +9 -0
  231. data/doc/examples/website_styles/andreas09/config.yaml +2 -0
  232. data/doc/examples/website_styles/andreas09/src/about.page +12 -0
  233. data/doc/examples/website_styles/andreas09/src/default.css +308 -0
  234. data/doc/examples/website_styles/andreas09/src/default.template +70 -0
  235. data/doc/examples/website_styles/andreas09/src/download.page +15 -0
  236. data/doc/examples/website_styles/andreas09/src/features.page +8 -0
  237. data/doc/examples/website_styles/andreas09/src/images/bodybg-black.jpg +0 -0
  238. data/doc/examples/website_styles/andreas09/src/images/bodybg-green.jpg +0 -0
  239. data/doc/examples/website_styles/andreas09/src/images/bodybg-orange.jpg +0 -0
  240. data/doc/examples/website_styles/andreas09/src/images/bodybg-purple.jpg +0 -0
  241. data/doc/examples/website_styles/andreas09/src/images/bodybg-red.jpg +0 -0
  242. data/doc/examples/website_styles/andreas09/src/images/bodybg.jpg +0 -0
  243. data/doc/examples/website_styles/andreas09/src/images/footerbg.jpg +0 -0
  244. data/doc/examples/website_styles/andreas09/src/images/menuhover-black.jpg +0 -0
  245. data/doc/examples/website_styles/andreas09/src/images/menuhover-green.jpg +0 -0
  246. data/doc/examples/website_styles/andreas09/src/images/menuhover-orange.jpg +0 -0
  247. data/doc/examples/website_styles/andreas09/src/images/menuhover-purple.jpg +0 -0
  248. data/doc/examples/website_styles/andreas09/src/images/menuhover-red.jpg +0 -0
  249. data/doc/examples/website_styles/andreas09/src/images/menuhover.jpg +0 -0
  250. data/doc/examples/website_styles/andreas09/src/index.page +9 -0
  251. data/doc/examples/website_styles/andreas09/src/screenshots.page +18 -0
  252. data/doc/examples/website_styles/default/README +9 -0
  253. data/doc/examples/website_styles/default/config.yaml +2 -0
  254. data/doc/examples/website_styles/default/src/about.page +12 -0
  255. data/doc/examples/website_styles/default/src/default.css +84 -0
  256. data/doc/examples/website_styles/default/src/default.template +38 -0
  257. data/doc/examples/website_styles/default/src/download.page +15 -0
  258. data/doc/examples/website_styles/default/src/features.page +8 -0
  259. data/doc/examples/website_styles/default/src/index.page +9 -0
  260. data/doc/examples/website_styles/default/src/screenshots.page +18 -0
  261. data/doc/examples/website_styles/plain/README +9 -0
  262. data/doc/examples/website_styles/plain/config.yaml +2 -0
  263. data/doc/examples/website_styles/plain/src/about.page +12 -0
  264. data/doc/examples/website_styles/plain/src/default.css +244 -0
  265. data/doc/examples/website_styles/plain/src/default.template +63 -0
  266. data/doc/examples/website_styles/plain/src/download.page +15 -0
  267. data/doc/examples/website_styles/plain/src/features.page +8 -0
  268. data/doc/examples/website_styles/plain/src/images/a_hover.jpg +0 -0
  269. data/doc/examples/website_styles/plain/src/images/desc.jpg +0 -0
  270. data/doc/examples/website_styles/plain/src/images/li.gif +0 -0
  271. data/doc/examples/website_styles/plain/src/images/mainbar.jpg +0 -0
  272. data/doc/examples/website_styles/plain/src/images/menu.jpg +0 -0
  273. data/doc/examples/website_styles/plain/src/images/submenua.gif +0 -0
  274. data/doc/examples/website_styles/plain/src/images/submenua_hover.jpg +0 -0
  275. data/doc/examples/website_styles/plain/src/index.page +9 -0
  276. data/doc/examples/website_styles/plain/src/screenshots.page +18 -0
  277. data/doc/examples/website_templates/default/README +8 -0
  278. data/doc/examples/website_templates/default/config.yaml +2 -0
  279. data/doc/examples/website_templates/default/src/default.css +84 -0
  280. data/doc/examples/website_templates/default/src/default.template +38 -0
  281. data/doc/examples/website_templates/default/src/index.page +8 -0
  282. data/doc/examples/website_templates/personal_hp/README +8 -0
  283. data/doc/examples/website_templates/personal_hp/config.yaml +2 -0
  284. data/doc/examples/website_templates/personal_hp/src/about.page +12 -0
  285. data/doc/examples/website_templates/personal_hp/src/default.css +84 -0
  286. data/doc/examples/website_templates/personal_hp/src/default.template +38 -0
  287. data/doc/examples/website_templates/personal_hp/src/index.page +9 -0
  288. data/doc/examples/website_templates/personal_hp/src/links.page +22 -0
  289. data/doc/examples/website_templates/personal_hp/src/projects.page +20 -0
  290. data/doc/examples/website_templates/project/README +9 -0
  291. data/doc/examples/website_templates/project/config.yaml +2 -0
  292. data/doc/examples/website_templates/project/src/about.page +12 -0
  293. data/doc/examples/website_templates/project/src/default.css +84 -0
  294. data/doc/examples/website_templates/project/src/default.template +38 -0
  295. data/doc/examples/website_templates/project/src/download.page +15 -0
  296. data/doc/examples/website_templates/project/src/features.page +8 -0
  297. data/doc/examples/website_templates/project/src/index.page +9 -0
  298. data/doc/examples/website_templates/project/src/screenshots.page +18 -0
  299. data/doc/metainfo.yaml +85 -0
  300. data/doc/plugin/emoticon.rb +19 -21
  301. data/doc/plugin/extension.rb +134 -55
  302. data/doc/plugin/gallery/slides/collage.rb +334 -0
  303. data/doc/plugin/listpluginparameters.rb +24 -26
  304. data/doc/plugin/resources.rb +20 -22
  305. data/doc/src/default.css +333 -154
  306. data/doc/src/default.template +92 -39
  307. data/doc/src/documentation/extending_webgen.page +1 -2
  308. data/doc/src/documentation/gettingstarted.page +161 -44
  309. data/doc/src/documentation/index.page +15 -28
  310. data/doc/src/documentation/plugins/contentconverter/default.page +15 -0
  311. data/doc/src/documentation/plugins/contentconverter/html.page +10 -0
  312. data/doc/src/documentation/plugins/contentconverter/markdown.page +21 -0
  313. data/doc/src/documentation/plugins/contentconverter/rdoc.page +11 -0
  314. data/doc/src/documentation/plugins/contentconverter/textile.page +21 -0
  315. data/doc/src/documentation/plugins/contentconverter/xmlbuilder.page +61 -0
  316. data/doc/src/documentation/plugins/core/configuration.page +11 -0
  317. data/doc/src/documentation/plugins/core/filehandler.page +214 -0
  318. data/doc/src/documentation/plugins/core/index.page +11 -0
  319. data/doc/src/documentation/plugins/core/resourcemanager.page +46 -0
  320. data/doc/src/documentation/plugins/core/tagprocessor.page +17 -0
  321. data/doc/src/documentation/plugins/file/copyhandler.page +26 -0
  322. data/doc/src/documentation/plugins/file/defaulthandler.page +15 -0
  323. data/doc/src/documentation/plugins/file/directoryhandler.page +37 -0
  324. data/doc/src/documentation/plugins/file/galleryhandler.page +181 -0
  325. data/doc/src/documentation/plugins/file/pagehandler.page +154 -0
  326. data/doc/src/documentation/plugins/file/templatehandler.page +34 -0
  327. data/doc/src/documentation/plugins/file/thumbnailwriter.page +39 -0
  328. data/doc/src/documentation/plugins/htmlvalidator/default.page +12 -0
  329. data/doc/src/documentation/plugins/htmlvalidator/xmllint.page +12 -0
  330. data/doc/src/documentation/plugins/index.page +32 -11
  331. data/doc/src/documentation/plugins/menustyle/default.page +19 -0
  332. data/doc/src/documentation/plugins/menustyle/horizontal.page +32 -0
  333. data/doc/src/documentation/plugins/{menustyles → menustyle}/horizontaldropdown.page +25 -19
  334. data/doc/src/documentation/plugins/menustyle/section.page +34 -0
  335. data/doc/src/documentation/plugins/menustyle/vertical.page +48 -0
  336. data/doc/src/documentation/plugins/menustyle/verticaldropdown.page +29 -0
  337. data/doc/src/documentation/plugins/misc/index.page +9 -0
  338. data/doc/src/documentation/plugins/{miscplugins → misc}/smileyreplacer.page +15 -14
  339. data/doc/src/documentation/plugins/misc/syntaxhighlighter.page +26 -0
  340. data/doc/src/documentation/plugins/tag/block.page +29 -0
  341. data/doc/src/documentation/plugins/tag/breadcrumbtrail.page +29 -0
  342. data/doc/src/documentation/plugins/tag/date.page +34 -0
  343. data/doc/src/documentation/plugins/tag/default.page +27 -0
  344. data/doc/src/documentation/plugins/tag/download.page +60 -0
  345. data/doc/src/documentation/plugins/tag/executecommand.page +29 -0
  346. data/doc/src/documentation/plugins/tag/includefile.page +30 -0
  347. data/doc/src/documentation/plugins/{tags → tag}/langbar.de.page +1 -1
  348. data/doc/src/documentation/plugins/tag/langbar.fr.page +6 -0
  349. data/doc/src/documentation/plugins/tag/langbar.page +41 -0
  350. data/doc/src/documentation/plugins/tag/menu.page +78 -0
  351. data/doc/src/documentation/plugins/{tags → tag}/meta.page +8 -7
  352. data/doc/src/documentation/plugins/tag/relocatable.page +46 -0
  353. data/doc/src/documentation/plugins/tag/resource.page +35 -0
  354. data/doc/src/documentation/plugins/tag/sitemap.page +35 -0
  355. data/doc/src/documentation/plugins/tag/wikilink.page +33 -0
  356. data/doc/src/documentation/references/index.page +0 -1
  357. data/doc/src/documentation/references/meta_info_reference.page +90 -13
  358. data/doc/src/documentation/references/parameter_reference.page +0 -1
  359. data/doc/src/documentation/references/webpage_format.page +249 -0
  360. data/doc/src/download.page +50 -21
  361. data/doc/src/examples/gallery_styles/default/default.gallery +78 -0
  362. data/doc/src/examples/gallery_styles/default/gallery_gallery.template +38 -0
  363. data/doc/src/examples/gallery_styles/default/gallery_image.template +30 -0
  364. data/doc/src/examples/gallery_styles/default/gallery_main.template +18 -0
  365. data/doc/src/examples/gallery_styles/index.page +22 -0
  366. data/doc/src/examples/gallery_styles/slides/gallery_gallery.template +62 -0
  367. data/doc/src/examples/gallery_styles/slides/gallery_image.template +53 -0
  368. data/doc/src/examples/gallery_styles/slides/gallery_main.template +32 -0
  369. data/doc/src/examples/gallery_styles/slides/slides.gallery +79 -0
  370. data/doc/src/examples/images/image01.jpg +0 -0
  371. data/doc/src/examples/images/image02.jpg +0 -0
  372. data/doc/src/examples/images/image03.jpg +0 -0
  373. data/doc/src/examples/images/image04.jpg +0 -0
  374. data/doc/src/examples/images/image05.jpg +0 -0
  375. data/doc/src/examples/images/image06.jpg +0 -0
  376. data/doc/src/examples/images/image07.jpg +0 -0
  377. data/doc/src/examples/images/image08.jpg +0 -0
  378. data/doc/src/examples/images/image09.jpg +0 -0
  379. data/doc/src/examples/images/image10.jpg +0 -0
  380. data/doc/src/examples/images/image11.jpg +0 -0
  381. data/doc/src/examples/images/image12.jpg +0 -0
  382. data/doc/src/examples/images/image13.jpg +0 -0
  383. data/doc/src/examples/images/image14.jpg +0 -0
  384. data/doc/src/examples/images/image15.jpg +0 -0
  385. data/doc/src/examples/images/image16.jpg +0 -0
  386. data/doc/src/examples/images/image17.jpg +0 -0
  387. data/doc/src/examples/images/image18.jpg +0 -0
  388. data/doc/src/examples/index.page +18 -0
  389. data/doc/src/examples/website_styles/1024px.page +5 -0
  390. data/doc/src/examples/website_styles/andreas00.page +5 -0
  391. data/doc/src/examples/website_styles/andreas01.page +5 -0
  392. data/doc/src/examples/website_styles/andreas03.page +5 -0
  393. data/doc/src/examples/website_styles/andreas04.page +5 -0
  394. data/doc/src/examples/website_styles/andreas05.page +5 -0
  395. data/doc/src/examples/website_styles/andreas06.page +5 -0
  396. data/doc/src/examples/website_styles/andreas07.page +5 -0
  397. data/doc/src/examples/website_styles/andreas08.page +5 -0
  398. data/doc/src/examples/website_styles/andreas09.page +5 -0
  399. data/doc/src/examples/website_styles/default.page +5 -0
  400. data/doc/src/examples/website_styles/index.page +71 -0
  401. data/doc/src/examples/website_styles/plain.page +5 -0
  402. data/doc/src/examples/website_templates/default.page +5 -0
  403. data/doc/src/examples/website_templates/index.page +24 -0
  404. data/doc/src/examples/website_templates/personal_hp.page +5 -0
  405. data/doc/src/examples/website_templates/project.page +5 -0
  406. data/doc/src/features.page +16 -14
  407. data/doc/src/images/bodybg.jpg +0 -0
  408. data/doc/src/images/footerbg.jpg +0 -0
  409. data/doc/src/images/menuhover.jpg +0 -0
  410. data/doc/src/images/node_diagram.svg +7132 -0
  411. data/doc/src/images/thumb_example.jpg +0 -0
  412. data/doc/src/images/thumb_example_cropped.jpg +0 -0
  413. data/doc/src/images/thumb_example_normal.jpg +0 -0
  414. data/doc/src/index.page +14 -102
  415. data/doc/src/news.page +154 -0
  416. data/doc/src/plugin.template +10 -0
  417. data/lib/webgen/cli.rb +427 -0
  418. data/lib/webgen/composite.rb +11 -11
  419. data/lib/webgen/config.rb +52 -0
  420. data/lib/webgen/content.rb +172 -0
  421. data/lib/webgen/extcommand.rb +23 -0
  422. data/lib/webgen/languages.rb +110 -0
  423. data/lib/webgen/listener.rb +1 -1
  424. data/lib/webgen/node.rb +196 -124
  425. data/lib/webgen/plugin.rb +480 -144
  426. data/lib/webgen/plugins/{contenthandlers → contentconverters}/default.rb +10 -9
  427. data/lib/webgen/plugins/{contenthandlers → contentconverters}/html.rb +11 -8
  428. data/lib/webgen/plugins/contentconverters/markdown.rb +54 -0
  429. data/lib/webgen/plugins/{contenthandlers → contentconverters}/rdoc.rb +16 -12
  430. data/lib/webgen/plugins/{contenthandlers → contentconverters}/textile.rb +18 -13
  431. data/lib/webgen/plugins/contentconverters/xmlbuilder.rb +58 -0
  432. data/lib/webgen/plugins/coreplugins/configuration.rb +11 -102
  433. data/lib/webgen/plugins/coreplugins/resourcemanager.rb +95 -74
  434. data/lib/webgen/plugins/filehandlers/copy.rb +41 -19
  435. data/lib/webgen/plugins/filehandlers/directory.rb +52 -50
  436. data/lib/webgen/plugins/filehandlers/filehandler.rb +370 -123
  437. data/lib/webgen/plugins/filehandlers/gallery.rb +368 -117
  438. data/lib/webgen/plugins/filehandlers/page.rb +160 -146
  439. data/lib/webgen/plugins/filehandlers/template.rb +65 -52
  440. data/lib/webgen/plugins/htmlvalidators/default.rb +9 -7
  441. data/lib/webgen/plugins/htmlvalidators/xmllint.rb +17 -33
  442. data/lib/webgen/plugins/menustyles/default.rb +27 -25
  443. data/lib/webgen/plugins/menustyles/horizontal.rb +22 -41
  444. data/lib/webgen/plugins/menustyles/horizontal_dropdown.rb +25 -39
  445. data/lib/webgen/plugins/menustyles/section.rb +68 -0
  446. data/lib/webgen/plugins/menustyles/vertical.rb +36 -56
  447. data/lib/webgen/plugins/menustyles/vertical_dropdown.rb +24 -32
  448. data/lib/webgen/plugins/miscplugins/smileyreplacer.rb +20 -17
  449. data/lib/webgen/plugins/miscplugins/syntax_highlighter.rb +72 -0
  450. data/lib/webgen/plugins/miscplugins/treewalker.rb +9 -36
  451. data/lib/webgen/plugins/tags/block.rb +65 -0
  452. data/lib/webgen/plugins/tags/breadcrumbtrail.rb +15 -11
  453. data/lib/webgen/plugins/tags/date.rb +11 -7
  454. data/lib/webgen/plugins/tags/download.rb +38 -38
  455. data/lib/webgen/plugins/tags/executecommand.rb +30 -15
  456. data/lib/webgen/plugins/tags/includefile.rb +26 -13
  457. data/lib/webgen/plugins/tags/langbar.rb +23 -18
  458. data/lib/webgen/plugins/tags/menu.rb +49 -70
  459. data/lib/webgen/plugins/tags/meta.rb +12 -9
  460. data/lib/webgen/plugins/tags/relocatable.rb +41 -13
  461. data/lib/webgen/plugins/tags/sitemap.rb +32 -28
  462. data/lib/webgen/plugins/tags/tag_processor.rb +279 -0
  463. data/lib/webgen/plugins/tags/wikilink.rb +25 -20
  464. data/lib/webgen/test.rb +202 -0
  465. data/lib/webgen/website.rb +310 -0
  466. data/test/fixtures/sample_site/src/chained.template +3 -0
  467. data/test/fixtures/sample_site/src/default.template +3 -0
  468. data/test/fixtures/sample_site/src/dir1/dir11/file111.de.page +3 -0
  469. data/test/fixtures/sample_site/src/dir1/dir11/file111.page +3 -0
  470. data/test/fixtures/sample_site/src/dir1/dir11/index.page +3 -0
  471. data/test/fixtures/sample_site/src/dir1/file11.page +3 -0
  472. data/test/fixtures/sample_site/src/dir2/file21.page +3 -0
  473. data/test/fixtures/sample_site/src/embedded.rhtml +1 -0
  474. data/test/fixtures/sample_site/src/file1.page +8 -0
  475. data/test/fixtures/sample_site/src/file2.de.page +6 -0
  476. data/test/fixtures/sample_site/src/index.de.page +4 -0
  477. data/test/fixtures/sample_site/src/index.en.page +1 -0
  478. data/test/fixtures/sample_site/src/invalid.template +3 -0
  479. data/test/fixtures/sample_site/src/test.jpg +1 -0
  480. data/test/fixtures/sample_site/src/test.template +3 -0
  481. data/test/fixtures/tc_content/blocks.yaml +40 -0
  482. data/test/fixtures/tc_content/correct.yaml +65 -0
  483. data/test/fixtures/tc_content/incorrect.yaml +42 -0
  484. data/test/fixtures/tc_filehandler_filehandler/backing/metainfo.yaml +9 -0
  485. data/test/fixtures/tc_filehandler_filehandler/backing_empty/metainfo.yaml +6 -0
  486. data/test/fixtures/tc_filehandler_filehandler/sample_plugin.rb +49 -0
  487. data/test/fixtures/tc_filehandler_filehandler/unmodified +0 -0
  488. data/test/fixtures/tc_filehandler_gallery/test.gallery +2 -0
  489. data/test/fixtures/tc_filehandler_gallery/test1.gallery +2 -0
  490. data/test/fixtures/tc_filehandler_gallery/test1.jpg +0 -0
  491. data/test/fixtures/tc_filehandler_gallery/test2.jpg +0 -0
  492. data/test/fixtures/tc_filehandler_gallery/test3.jpg +0 -0
  493. data/test/fixtures/tc_filehandler_gallery/test4.jpg +0 -0
  494. data/test/fixtures/tc_filehandler_page/testdata.yaml +10 -0
  495. data/test/fixtures/tc_menustyles_default/menustyle.rb +7 -0
  496. data/test/fixtures/tc_node/nodes.yaml +64 -0
  497. data/test/fixtures/tc_plugin/handlerplugin.rb +15 -0
  498. data/test/fixtures/tc_plugin/plugin1.rb +33 -0
  499. data/test/fixtures/tc_plugin/plugin2.rb +8 -0
  500. data/test/fixtures/tc_tags_includefile/testfile +1 -0
  501. data/test/fixtures/tc_tags_tag_processor/test_file1 +1 -0
  502. data/test/fixtures/tc_tags_tag_processor/testtag.rb +17 -0
  503. data/test/fixtures/tc_website/correct.yaml +6 -0
  504. data/test/fixtures/tc_website/incorrect_structure.yaml +2 -0
  505. data/test/fixtures/tc_website/incorrect_yaml.yaml +5 -0
  506. data/test/fixtures/tc_website/meta_info_test.yaml +10 -0
  507. data/test/fixtures/tc_website/testdir/README +1 -0
  508. data/test/fixtures/tc_website/testdir/falsedir/README +1 -0
  509. data/test/runtests.rb +2 -0
  510. data/test/unittests/tc_composite.rb +82 -0
  511. data/test/unittests/tc_config.rb +18 -0
  512. data/test/unittests/tc_content.rb +88 -0
  513. data/test/unittests/tc_contentconverters_default.rb +13 -0
  514. data/test/unittests/tc_contentconverters_html.rb +16 -0
  515. data/test/unittests/tc_contentconverters_markdown.rb +22 -0
  516. data/test/unittests/tc_contentconverters_rdoc.rb +16 -0
  517. data/test/unittests/tc_contentconverters_textile.rb +22 -0
  518. data/test/unittests/tc_contentconverters_xmlbuilder.rb +22 -0
  519. data/test/unittests/tc_filehandler_copy.rb +65 -0
  520. data/test/unittests/tc_filehandler_directory.rb +134 -0
  521. data/test/unittests/tc_filehandler_filehandler.rb +294 -0
  522. data/test/unittests/tc_filehandler_gallery.rb +165 -0
  523. data/test/unittests/tc_filehandler_page.rb +183 -0
  524. data/test/unittests/tc_filehandler_template.rb +60 -0
  525. data/test/unittests/tc_htmlvalidators_default.rb +12 -0
  526. data/test/unittests/tc_htmlvalidators_xmllint.rb +19 -0
  527. data/test/unittests/tc_languages.rb +57 -0
  528. data/test/unittests/tc_listener.rb +72 -0
  529. data/test/unittests/tc_menustyles_default.rb +51 -0
  530. data/test/unittests/tc_menustyles_horizontal.rb +18 -0
  531. data/test/unittests/tc_menustyles_horizontal_dropdown.rb +18 -0
  532. data/test/unittests/tc_menustyles_section.rb +59 -0
  533. data/test/unittests/tc_menustyles_vertical.rb +79 -0
  534. data/test/unittests/tc_menustyles_vertical_dropdown.rb +18 -0
  535. data/test/unittests/tc_node.rb +202 -0
  536. data/test/unittests/tc_plugin.rb +214 -0
  537. data/test/unittests/tc_resourcemanager.rb +42 -0
  538. data/test/unittests/tc_smileyreplacer.rb +25 -0
  539. data/test/unittests/tc_syntax_highlighter.rb +30 -0
  540. data/test/unittests/tc_tags_block.rb +27 -0
  541. data/test/unittests/tc_tags_breadcrumbtrail.rb +22 -0
  542. data/test/unittests/tc_tags_date.rb +15 -0
  543. data/test/unittests/tc_tags_download.rb +32 -0
  544. data/test/unittests/tc_tags_executecommand.rb +37 -0
  545. data/test/unittests/tc_tags_includefile.rb +53 -0
  546. data/test/unittests/tc_tags_langbar.rb +42 -0
  547. data/test/unittests/tc_tags_menu.rb +50 -0
  548. data/test/unittests/tc_tags_meta.rb +19 -0
  549. data/test/unittests/tc_tags_relocatable.rb +66 -0
  550. data/test/unittests/tc_tags_sitemap.rb +33 -0
  551. data/test/unittests/tc_tags_tag_processor.rb +107 -0
  552. data/test/unittests/tc_tags_wikilink.rb +22 -0
  553. data/test/unittests/tc_treewalker.rb +44 -0
  554. data/test/unittests/tc_website.rb +188 -0
  555. metadata +829 -312
  556. data/bin/webgen-gallery-editor +0 -654
  557. data/bin/webgen-gui +0 -10
  558. data/data/webgen/website_templates/default/config.yaml +0 -2
  559. data/doc/plugin/clidesc.rb +0 -46
  560. data/doc/plugin/source.rb +0 -21
  561. data/doc/src/about.page +0 -22
  562. data/doc/src/documentation/cli.page +0 -12
  563. data/doc/src/documentation/plugins/contenthandlers/html.page +0 -11
  564. data/doc/src/documentation/plugins/contenthandlers/index.page +0 -7
  565. data/doc/src/documentation/plugins/contenthandlers/markdown.page +0 -11
  566. data/doc/src/documentation/plugins/contenthandlers/rdoc.page +0 -11
  567. data/doc/src/documentation/plugins/contenthandlers/textile.page +0 -11
  568. data/doc/src/documentation/plugins/coreplugins/configuration.page +0 -12
  569. data/doc/src/documentation/plugins/coreplugins/index.page +0 -7
  570. data/doc/src/documentation/plugins/coreplugins/logging.page +0 -13
  571. data/doc/src/documentation/plugins/coreplugins/resourcemanager.page +0 -34
  572. data/doc/src/documentation/plugins/filehandlers/backing.page +0 -46
  573. data/doc/src/documentation/plugins/filehandlers/copy.page +0 -12
  574. data/doc/src/documentation/plugins/filehandlers/directoryhandler.page +0 -35
  575. data/doc/src/documentation/plugins/filehandlers/gallery.page +0 -86
  576. data/doc/src/documentation/plugins/filehandlers/index.page +0 -34
  577. data/doc/src/documentation/plugins/filehandlers/page.page +0 -170
  578. data/doc/src/documentation/plugins/filehandlers/template.page +0 -21
  579. data/doc/src/documentation/plugins/gallerylayouters/index.page +0 -18
  580. data/doc/src/documentation/plugins/htmlvalidators/index.page +0 -6
  581. data/doc/src/documentation/plugins/htmlvalidators/xmllint.page +0 -14
  582. data/doc/src/documentation/plugins/menustyles/horizontal.page +0 -21
  583. data/doc/src/documentation/plugins/menustyles/index.page +0 -12
  584. data/doc/src/documentation/plugins/menustyles/partial.page +0 -27
  585. data/doc/src/documentation/plugins/menustyles/vertical.page +0 -32
  586. data/doc/src/documentation/plugins/menustyles/verticaldropdown.page +0 -23
  587. data/doc/src/documentation/plugins/miscplugins/index.page +0 -7
  588. data/doc/src/documentation/plugins/tags/breadcrumbtrail.page +0 -20
  589. data/doc/src/documentation/plugins/tags/date.page +0 -19
  590. data/doc/src/documentation/plugins/tags/download.page +0 -23
  591. data/doc/src/documentation/plugins/tags/executecommand.page +0 -18
  592. data/doc/src/documentation/plugins/tags/includefile.page +0 -15
  593. data/doc/src/documentation/plugins/tags/index.page +0 -44
  594. data/doc/src/documentation/plugins/tags/langbar.page +0 -27
  595. data/doc/src/documentation/plugins/tags/menu.de.page +0 -12
  596. data/doc/src/documentation/plugins/tags/menu.page +0 -19
  597. data/doc/src/documentation/plugins/tags/multilang.de.page +0 -4
  598. data/doc/src/documentation/plugins/tags/multilang.fr.page +0 -4
  599. data/doc/src/documentation/plugins/tags/multilang.page +0 -4
  600. data/doc/src/documentation/plugins/tags/relocatable.page +0 -16
  601. data/doc/src/documentation/plugins/tags/resource.page +0 -22
  602. data/doc/src/documentation/plugins/tags/sitemap.page +0 -17
  603. data/doc/src/documentation/plugins/tags/wikilink.page +0 -18
  604. data/doc/src/documentation/webgen_gallery_editor.page +0 -82
  605. data/doc/src/images/screenshots/wge-image.png +0 -0
  606. data/doc/src/images/screenshots/wge-layout-preview.png +0 -0
  607. data/doc/src/images/screenshots/wge-main-disabled.png +0 -0
  608. data/doc/src/images/screenshots/wge-main.png +0 -0
  609. data/doc/src/meta.info +0 -30
  610. data/doc/src/screenshots.gallery +0 -33
  611. data/install.rb +0 -19
  612. data/lib/webgen.rb +0 -277
  613. data/lib/webgen/plugins/contenthandlers/markdown.rb +0 -50
  614. data/lib/webgen/plugins/coreplugins/logging.rb +0 -101
  615. data/lib/webgen/plugins/filehandlers/backing.rb +0 -159
  616. data/lib/webgen/plugins/gallerylayouters/default.rb +0 -152
  617. data/lib/webgen/plugins/menustyles/partial.rb +0 -95
  618. data/lib/webgen/plugins/tags/tags.rb +0 -254
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: plugin.rb 369 2005-12-24 11:37:40Z thomas $
4
+ # $Id: plugin.rb 578 2007-01-04 20:35:37Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -20,13 +20,18 @@
20
20
  #++
21
21
  #
22
22
 
23
+ require 'find'
23
24
  require 'yaml'
24
25
  require 'ostruct'
26
+ require 'logger'
27
+ require 'tsort'
28
+ require 'webgen/config'
25
29
 
26
30
  class OpenStruct
27
31
  public :table #:nodoc:#
28
32
  end
29
33
 
34
+
30
35
  module Webgen
31
36
 
32
37
  # Base module for all plugins. This module should be included by classes which need to derive from
@@ -38,47 +43,6 @@ module Webgen
38
43
  # PluginDefs module.
39
44
  module ClassMethods
40
45
 
41
- # Holds the plugin data from each and every plugin.
42
- @@config = {}
43
- @@configFileData = {}
44
-
45
- # Reloads the configuration file data.
46
- def load_config_file
47
- @@configFileData = ( File.exists?( 'config.yaml' ) ? YAML::load( File.new( 'config.yaml' ) ) : {} )
48
- @@configFileData = {} unless @@configFileData.kind_of?( Hash )
49
- @@configFileData.each do |pluginName, params|
50
- next if (pair = @@config.find {|pluginKlass, data| data.plugin == pluginName}).nil?
51
- if params.kind_of?( Hash ) && !pair[1].params.nil?
52
- pair[1].params.each do |name, value|
53
- set_param( pluginName, name, params[name] ) if params.has_key?( name )
54
- end
55
- end
56
- end
57
- end
58
-
59
- # Reset the configuration data. The configuration has to be initialized again.
60
- def reset_config_data
61
- @@config.each do |pluginKlass, data|
62
- if pluginKlass != Logging && pluginKlass != Configuration
63
- data.obj = nil
64
- end
65
- data.params.each {|name, p| set_param( data.plugin, name, p.default ) } if data.params
66
- end
67
- load_config_file
68
- end
69
-
70
- # Return plugin data
71
- def config
72
- @@config
73
- end
74
-
75
- # Shortcut for getting the plugin with the name +name+.
76
- def []( name )
77
- pair = @@config.find {|k,v| v.plugin == name }
78
- self.logger.warn { "Could not retrieve plugin '#{name}' as such a plugin does not exist!" } if pair.nil?
79
- pair[1].obj unless pair.nil?
80
- end
81
-
82
46
  # Add subclass to plugin data.
83
47
  def inherited( klass )
84
48
  ClassMethods.extended( klass )
@@ -86,153 +50,525 @@ module Webgen
86
50
 
87
51
  # Called when PluginDefs is included in another class. Add this class to plugin data.
88
52
  def self.extended( klass )
89
- if (klass != Webgen::Plugin) && (klass != Webgen::CommandPlugin)
90
- (@@config[klass] = OpenStruct.new).klass = klass
91
- @@config[klass].plugin = klass.name.split( /::/ ).last
92
- end
53
+ callcc {|cont| throw :plugin_class_found, [cont, klass]}
54
+ klass.init_config
55
+ rescue NameError => e
56
+ raise "Plugin '#{klass}' managed by no PluginLoader"
93
57
  end
94
58
 
95
- ['summary', 'description'].each do |name|
96
- module_eval "def #{name}( obj ); @@config[self].#{name} = obj; end"
59
+ # Initializes the plugin configuration structure.
60
+ def init_config
61
+ @config = OpenStruct.new
62
+ @config.plugin_klass = self
63
+ @config.params = {}
64
+ @config.infos = {}
65
+ @config.infos[:name] = self.name.sub(/^(#<.*?>|Webgen::DEFAULT_WRAPPER_MODULE)::/,'').sub('::','/')
66
+ @config.dependencies = []
97
67
  end
98
68
 
69
+ # Returns the configuration structure for the plugin.
70
+ def config
71
+ @config
72
+ end
99
73
 
100
- # Add a dependency to the plugin. Dependencies are instantiated before the plugin gets
101
- # instantiated.
102
- def depends_on( *dep )
103
- dep.each {|d| (@@config[self].dependencies ||= []) << d}
74
+ # Returns the name of the plugin. If not plugin name is set a default value is used.
75
+ def plugin_name
76
+ @config.infos[:name]
104
77
  end
105
78
 
106
- # Specify which meta information entries are used by the plugin.
107
- def used_meta_info( *names )
108
- names.each {|n| (@@config[self].used_meta_info ||= []) << n }
79
+ # Sets general information about the plugin (summary text, description, ...). The parameter
80
+ # has to be a Hash. The following fields are recognized:
81
+ # :name :: The name of the plugin. Should be of the form Namespace/Namespace/name and
82
+ # should contain only alphanumeric characters.
83
+ # :summary :: Summary of what the plugin does
84
+ # :description :: Extended description of the functionality
85
+ # :author :: The author of the plugin
86
+ # :instantiate :: Boolean value defining whether an instance of this plugin should be created
87
+ # :is_base_plugin :: Boolean value defining whether the plugin class is available from a plugin
88
+ # loader/manager after loading
89
+ def infos( param )
90
+ self.config.infos.update( param )
91
+ end
92
+
93
+ # Add a dependency to the plugin, ie. the name of another plugin. Dependencies are
94
+ # instantiated before the plugin gets instantiated. So only add those plugins here that you
95
+ # need to reference/use in the initialize method! The parameters have to be Strings!
96
+ def depends_on( *dep )
97
+ dep.each {|d| self.config.dependencies << d}
109
98
  end
110
99
 
111
- # Add a parameter for the current class. Has to be used by subclasses to define their parameters!
100
+ # Defines a parameter.The parameter can be changed in the configuration file later.
112
101
  #
113
102
  # Arguments:
114
103
  # +name+:: the name of the parameter
115
104
  # +default+:: the default value of the parameter
116
105
  # +description+:: a small description of the parameter
117
- # +changeHandler+:: optional, method/proc which is invoked every time the parameter is changed.
118
- # Handler signature: changeHandler( paramName, oldValue, newValue )
119
- def add_param( name, default, description, changeHandler = nil )
120
- self.logger.debug { "Adding parameter '#{name}' for plugin class '#{self.name}'" }
121
- if @@configFileData.kind_of?( Hash ) && @@configFileData.has_key?( @@config[self].plugin ) \
122
- && @@configFileData[@@config[self].plugin].kind_of?( Hash ) && @@configFileData[@@config[self].plugin].has_key?( name )
123
- curval = @@configFileData[@@config[self].plugin][name]
124
- self.logger.debug { "Using configured value for parameter #{@@config[self].plugin} -> #{name}" }
125
- else
126
- curval = default
106
+ def param( name, default, description )
107
+ data = OpenStruct.new( :name => name, :default => default, :description => description )
108
+ self.config.params[name] = data
109
+ end
110
+
111
+ # Returns the ancestor classes for the object's class which are not base plugins.
112
+ def ancestor_classes
113
+ ancestors.delete_if {|c| c.instance_of?( Module ) ||
114
+ (c.respond_to?( :config ) && c.config.infos[:is_base_plugin] == true) }[0..-2]
115
+ end
116
+
117
+ end
118
+
119
+ # Appends the methods of this module as object methods to the including class and the methods
120
+ # defined in the module ClassMethods as class methods.
121
+ def self.append_features( klass )
122
+ super
123
+ klass.extend( ClassMethods )
124
+ end
125
+
126
+ # Assigns the PluginManager used for the plugin instance.
127
+ def initialize( plugin_manager )
128
+ @plugin_manager = plugin_manager
129
+ end
130
+
131
+ # Returns the parameter +name+ for the plugin. If +plugin+ is specified, the parameter +name+
132
+ # for the plugin +plugin+ is returned.
133
+ def []( name, plugin = nil)
134
+ @plugin_manager.param_for_plugin( plugin || self.class.plugin_name, name )
135
+ end
136
+ alias param []
137
+
138
+ CALLER_REGEXP = Regexp.new("`.*'")
139
+
140
+ # Logs the the result of +block+ using the severity level +sev_level+.
141
+ def log( sev_level, &block )
142
+ source = self.class.plugin_name + '#' + caller[0][CALLER_REGEXP][1..-2]
143
+ @plugin_manager.log_msg( sev_level, source, &block )
144
+ end
145
+
146
+ end
147
+
148
+ class ::Object
149
+
150
+ # This method should be used instead of +require+ when loading a plugin file.
151
+ def load_plugin( file )
152
+ file = file + '.rb' unless /\.rb$/ =~ file
153
+ wrapper, do_load = callcc {|cont| throw :load_plugin_file?, [cont, file]}
154
+
155
+ realfile = file
156
+ if /^(\/|\w:)/ !~ realfile
157
+ $:.each do |path|
158
+ realfile = File.join( path, file )
159
+ break if File.exists?( realfile )
127
160
  end
128
- data = OpenStruct.new( :name => name, :value => curval, :default => default, :description => description, :changeHandler => changeHandler )
129
- (@@config[self].params ||= {})[name] = data
130
- changeHandler.call( name, default, curval ) if changeHandler
131
- end
132
-
133
- # Set parameter +name+ for +plugin+ to +value+.
134
- def set_param( plugin, name, value )
135
- found = catch( :found ) do
136
- item = @@config.find {|k,v| v.plugin == plugin }[1]
137
- item.klass.ancestor_classes.each do |k|
138
- item = @@config[k]
139
- if !item.nil? && !item.params.nil? && item.params.has_key?( name )
140
- oldvalue = item.params[name].value
141
- item.params[name].value = value
142
- item.params[name].changeHandler.call( name, oldvalue, value ) if item.params[name].changeHandler
143
- logger.debug { "Set parameter '#{name}' for plugin '#{plugin}' to #{value.inspect}" }
144
- throw :found, true
145
- end
146
- end
161
+ end
162
+
163
+ wrapper.module_eval( File.read( realfile ), file, 1 ) if do_load
164
+ end
165
+
166
+ # Used to load optional parts. You have to specify a unique +name+ for the optional part and
167
+ # options with some information about it. The following keys can be used:
168
+ # :needed_gems :: an array of Rubygem's gem names that are required for the part
169
+ # :error_msg :: error message that should be displayed if the part can't be loaded
170
+ # :info :: information about what the part does
171
+ def load_optional_part( name, options = {} )
172
+ options[:loaded] = true
173
+ begin
174
+ yield
175
+ rescue LoadError => e
176
+ options[:loaded] = false
177
+ options[:error_msg] ||= e.message
178
+ end
179
+ callcc {|cont| throw :load_optional_part, [cont, name, options]}
180
+ end
181
+
182
+ end
183
+
184
+ # Responsible for loading plugins classes. Each PluginLoader has an array of plugin classes which
185
+ # it loaded. Several methods for loading plugins classes are available.
186
+ class PluginLoader
187
+
188
+ # The plugin classes loaded by this PluginLoader instance.
189
+ attr_reader :plugin_classes
190
+
191
+ # The optional parts managed (loaded or not) by this PluginLoader instance.
192
+ attr_reader :optional_parts
193
+
194
+ # Creates a new PluginLoader instance. The +wrapper_module+ is used when loading the plugins so
195
+ # that they do not pollute the global namespace.
196
+ def initialize( wrapper_module = Module.new )
197
+ @plugin_classes = []
198
+ @loaded_files = []
199
+ @wrapper_module = wrapper_module
200
+ @optional_parts = {}
201
+ end
202
+
203
+ # Loads all plugin classes in the given +dir+ and in its subdirectories. Before +require+ is
204
+ # actually called the path is trimmed: if +trimpath+ matches the beginning of the string,
205
+ # +trimpath+ is deleted from it. The loaded classes are wrapped in the wrapper module and won't
206
+ # pollute the namespace.
207
+ def load_from_dir( dir, trimpath = '')
208
+ Find.find( dir ) do |file|
209
+ trimmedFile = file.gsub(/^#{trimpath}/, '')
210
+ Find.prune unless File.directory?( file ) || (/\.rb$/ =~ file)
211
+ load_from_file( trimmedFile ) if File.file?( file ) && /\.rb$/ =~ file
212
+ end
213
+ end
214
+
215
+ # Loads all plugin classes specified in the +file+.The loaded classes are wrapped in the wrapper
216
+ # module and won't pollute the namespace.
217
+ def load_from_file( file )
218
+ load_from_block do
219
+ cont, file = catch( :load_plugin_file? ) do
220
+ load_plugin( file )
221
+ nil
147
222
  end
148
- logger.error { "Cannot set undefined parameter '#{name}' for plugin '#{plugin}'" } unless found
223
+ do_load_file = !@loaded_files.include?( file ) unless file.nil?
224
+ @loaded_files << file unless file.nil? || @loaded_files.include?( file )
225
+ cont.call( @wrapper_module, do_load_file ) if cont
149
226
  end
227
+ end
150
228
 
151
- def get_param( name )
152
- ancestor_classes.each do |klass|
153
- data = @@config[klass]
154
- return data.params[name].value unless data.params.nil? || data.params[name].nil?
229
+ # Loads all plugin classes which get declared in the given block. Be aware that this method does
230
+ # not put the classes into the wrapper module!
231
+ def load_from_block( &block )
232
+ cont, klass = catch( :plugin_class_found ) do
233
+ cont, name, options = catch( :load_optional_part ) { yield }
234
+ if cont
235
+ @optional_parts[name] = options
236
+ cont.call
155
237
  end
156
- logger.error { "Referencing invalid configuration value '#{name}' in class #{self.name}" }
157
- return nil
158
- end
159
-
160
- # Defines a new *handler class. The methods creates two methods based on the parameter +name+:
161
- # - klass.register_[name]
162
- # - object.get_[name]
163
- def define_handler( name )
164
- s = "def self.register_#{name}( param )
165
- self.logger.info { \"Registering class \#{self.name} for handling #{name} '\#{param}'\" }
166
- (Webgen::Plugin.config[#{self.name}].#{name}s ||= {})[param] = self
167
- Webgen::Plugin.config[self].registered_#{name} = param
168
- end\n"
169
- s += "def get_#{name}( param )
170
- if Webgen::Plugin.config[#{self.name}].#{name}s.has_key?( param )
171
- Webgen::Plugin.config[Webgen::Plugin.config[#{self.name}].#{name}s[param]].obj
172
- else
173
- self.logger.error { \"Invalid #{name} specified: \#{param}! Using #{self.name}!\" }
174
- Webgen::Plugin.config[#{self.name}].obj
238
+ nil # return value for catch, means: all classes processed
239
+ end
240
+ add_plugin_class( klass ) unless klass.nil?
241
+ cont.call if cont
242
+ sort_out_base_plugins
243
+ end
244
+
245
+ # Checks if this PluginLoader has loaded a plugin called +name+.
246
+ def has_plugin?( name )
247
+ plugin_class_for_name( name ) != nil
248
+ end
249
+
250
+ # Returns the plugin class called +name+ or +nil+ if it is not found.
251
+ def plugin_class_for_name( name )
252
+ @plugin_classes.find {|p| p.plugin_name == name}
253
+ end
254
+
255
+ #######
256
+ private
257
+ #######
258
+
259
+ def add_plugin_class( klass )
260
+ @plugin_classes << klass
261
+ end
262
+
263
+ def sort_out_base_plugins
264
+ @plugin_classes.delete_if {|klass| klass.config.infos[:is_base_plugin] == true}
265
+ end
266
+
267
+ end
268
+
269
+
270
+ # Raised when a plugin which should have been loaded was not loaded.
271
+ class PluginNotFound < RuntimeError
272
+
273
+ attr_reader :name
274
+ attr_reader :needed_by
275
+
276
+ def initialize( name, needed_by )
277
+ @name = name
278
+ @needed_by = needed_by
279
+ end
280
+
281
+ def message
282
+ "Plugin '#{@name}' needed by '#{@needed_by}', but it was not loaded"
283
+ end
284
+
285
+ end
286
+
287
+
288
+ # Raised when a parameter for a plugin does not exist.
289
+ class PluginParamNotFound < RuntimeError
290
+
291
+ def initialize( plugin, param )
292
+ @plugin = plugin
293
+ @param = param
294
+ end
295
+
296
+ def message
297
+ "Could not find parameter '#{@param}' for plugin '#{@plugin}'"
298
+ end
299
+
300
+ end
301
+
302
+
303
+ # This class should be passed as return value if the value for a parameter could not be found.
304
+ class PluginParamValueNotFound; end
305
+
306
+
307
+ # Helper class for calculating plugin dependencies.
308
+ class DependencyHash < Hash
309
+ include TSort
310
+
311
+ alias tsort_each_node each_key
312
+ def tsort_each_child(node, &block)
313
+ fetch(node).each(&block)
314
+ end
315
+ end
316
+
317
+
318
+ # Once plugin classes are loaded, they are ready to get used. This class is used for instantiating
319
+ # plugins and their dependencies in the correct order and provide the plugins the facility for
320
+ # retrieving current parameter values.
321
+ class PluginManager
322
+
323
+ # A hash of all instantiated plugins.
324
+ attr_reader :plugins
325
+
326
+ # Used for plugin dependency resolution.
327
+ attr_reader :plugin_loaders
328
+
329
+ # Used for retrieving current plugin parameter values. Should be set before calling #init.
330
+ attr_accessor :plugin_config
331
+
332
+ # The logger used by the instance and the plugin objects.
333
+ attr_accessor :logger
334
+
335
+ # Creates a new PluginManager instance.
336
+ def initialize( plugin_loaders = [], plugin_classes = [] )
337
+ @logger = nil
338
+ @plugins = {}
339
+ @plugin_classes = {}
340
+ @plugin_loaders = plugin_loaders
341
+ @plugin_config = nil
342
+ add_plugin_classes( plugin_classes )
343
+ end
344
+
345
+ # A list of all plugins that should get instantiated.
346
+ def plugin_classes
347
+ @plugin_classes.values
348
+ end
349
+
350
+ # Adds all Plugin classes in the array +plugins+ and their dependencies.
351
+ def add_plugin_classes( plugins )
352
+ deps = dependent_plugins( plugins )
353
+ (plugins + deps).each {|p| @plugin_classes[p.plugin_name] = p }
354
+ end
355
+
356
+ # Instantiates the plugins in the correct order, except the classes which have the plugin info
357
+ # +:instantiate+ set to +false+.
358
+ def init
359
+ @plugins = {}
360
+ #precalculate_param_values! #TODO: maybe activate this feature
361
+ dep = DependencyHash.new
362
+ @plugin_classes.each {|name, plugin| dep[name] = plugin.config.dependencies }
363
+ dep.tsort.each do |plugin_name|
364
+ config = plugin_class_for_name( plugin_name ).config
365
+ unless config.infos.has_key?(:instantiate) && !config.infos[:instantiate]
366
+ log_msg( :debug, 'PluginManager#init') { "Creating plugin of class #{config.plugin_name}" }
367
+ @plugins[plugin_name] = config.plugin_klass.new( self )
175
368
  end
176
- end"
177
- module_eval s
178
369
  end
370
+ end
179
371
 
180
- # Return the ancestor classes for the object's class which are sub classes from Plugin.
181
- def ancestor_classes
182
- ancestors.delete_if {|c| c.instance_of?( Module ) }[0..-3]
372
+ # Returns the plugin instance for the plugin called +plugin_name+.
373
+ def []( plugin_name )
374
+ @plugins[plugin_name]
375
+ end
376
+
377
+ # Returns the parameter +param+ for the plugin called +plugin_name+.
378
+ def param_for_plugin( plugin_name, param )
379
+ plugin = plugin_class_for_name( plugin_name )
380
+ raise PluginParamNotFound.new( plugin_name, param ) if plugin.nil?
381
+
382
+ if @precalculated_param_values
383
+ value = @precalculated_param_values[plugin_name][param]
384
+ else
385
+ value = PluginParamValueNotFound
386
+ plugin.ancestor_classes.each do |plugin_klass|
387
+ value = get_plugin_param_value( plugin_klass.plugin_name, plugin_klass.config, param )
388
+ break unless value == PluginParamValueNotFound
389
+ end
183
390
  end
184
391
 
392
+ if value != PluginParamValueNotFound
393
+ value
394
+ else
395
+ raise PluginParamNotFound.new( plugin.plugin_name, param )
396
+ end
185
397
  end
186
398
 
187
- def self.append_features( klass )
188
- super
189
- klass.extend( ClassMethods )
399
+ # Returns the plugin class for the plugin +plugin_name+.
400
+ def plugin_class_for_name( plugin_name )
401
+ @plugin_classes[plugin_name]
190
402
  end
191
403
 
192
- # Return parameter +name+.
193
- def []( name )
194
- self.class.get_param( name )
404
+ # Returns the options hash for the given optional library.
405
+ def optional_part( name )
406
+ @plugin_loaders.each {|pl| return pl.optional_parts[name] if pl.optional_parts.has_key?( name ) }
195
407
  end
196
- alias get_param []
197
408
 
198
- # Set parameter +name+.
199
- def []=( name, value )
200
- self.class.set_param( self.class.config[self.class].plugin, name, value )
409
+ # Logs the result of executing +block+ under the severity level +sev_level+. The parameter
410
+ # +source+ identifies the source of the log message.
411
+ def log_msg( sev_level, source, &block )
412
+ @logger.send( sev_level, source, &block ) if @logger
413
+ nil
201
414
  end
202
415
 
203
- # Checks if the plugin has a parameter +name+.
204
- def has_param?( name )
205
- self.class.ancestor_classes.any? do |klass|
206
- !self.class.config[klass].params.nil? && self.class.config[klass].params.has_key?( name )
416
+ #######
417
+ private
418
+ #######
419
+
420
+ def precalculate_param_values!
421
+ @precalculated_param_values = nil
422
+ precalc = Hash.new {|h,k| h[k] = Hash.new( PluginParamValueNotFound ) }
423
+ @plugin_classes.each do |name, klass|
424
+ klass.ancestor_classes.each do |a_klass|
425
+ a_klass.config.params.each do |p_name, p_data|
426
+ precalc[name][p_name] = param_for_plugin( name, p_name )
427
+ end
428
+ end
429
+ end
430
+ @precalculated_param_values = precalc
431
+ end
432
+
433
+ def dependent_plugins( classes )
434
+ deps = []
435
+ classes.each do |plugin|
436
+ plugin.config.dependencies.each do |dep|
437
+ p = nil
438
+ @plugin_loaders.each {|loader| p = loader.plugin_class_for_name( dep ); break unless p.nil? }
439
+ if p.nil?
440
+ raise PluginNotFound.new( dep, plugin.plugin_name )
441
+ else
442
+ deps << p unless deps.include?( p )
443
+ end
444
+ end
207
445
  end
446
+ deps
447
+ end
448
+
449
+ def get_plugin_param_value( plugin_name, config, param )
450
+ return PluginParamValueNotFound unless config.params.has_key?( param )
451
+
452
+ value = PluginParamValueNotFound
453
+ value = @plugin_config.param_for_plugin( plugin_name, param ) if @plugin_config
454
+ value = config.params[param].default if value == PluginParamValueNotFound
455
+
456
+ value
208
457
  end
209
458
 
210
459
  end
211
460
 
212
- module CommandPlugin; end
213
461
 
214
- # The base class for all plugins.
215
- class Plugin
216
- include PluginDefs
462
+ # Used for logging the messages of plugin instances.
463
+ class Logger < ::Logger
464
+
465
+ def initialize( logdev = STDERR )
466
+ super( logdev, 0, 0 )
467
+ self.level = ::Logger::ERROR
468
+ self.formatter = Proc.new do |severity, timestamp, progname, msg|
469
+ if self.level == ::Logger::DEBUG
470
+ "%5s -- %s: %s\n" % [severity, progname, msg ]
471
+ else
472
+ "%5s -- %s\n" % [severity, msg]
473
+ end
474
+ end
475
+ end
217
476
 
218
- load_config_file
219
477
  end
220
478
 
221
- # This module should be included by classes derived from CommandParser::Command as it
222
- # automatically adds an object of the class to the main CommandParser object.
223
- module CommandPlugin
224
- include PluginDefs
479
+ end
480
+
481
+
482
+
483
+ module Webgen
484
+
485
+ DEFAULT_PLUGIN_LOAD_PROC = proc do
486
+
487
+ # THE base class for all plugins.
488
+ #
489
+ # Information about a plugin can be set via the class method +infos+. If no name for the plugin
490
+ # is set, then the full plugin class name (including the namespace modules) is used, with
491
+ # slashes instead of the double colons.
492
+ class Plugin
493
+
494
+ include PluginDefs
495
+
496
+ infos :is_base_plugin => true
225
497
 
226
- def self.append_features( klass )
227
- super
228
- PluginDefs.append_features( klass )
229
- klass.extend( ClassMethods )
230
498
  end
499
+
500
+ # You can use this class for easily handling similiar things, for example, various markup to
501
+ # HTML converters.
502
+ #
503
+ # To use it, just create a subclass of HandlerPlugin which will be the manager for a class of
504
+ # plugins. This subclass should specify all the methods, specific implementations should
505
+ # provide. The specific implementations should then be derived from this subclass, each using a
506
+ # different name for +register_handler+. Then you can retrieve a specific implementation by
507
+ # using the method registered_handlers[<NAME>] on the manager class.
508
+ class HandlerPlugin < Plugin
509
+
510
+ infos :is_base_plugin => true
511
+
512
+ # Defines the name for the specific handler under which the handler instance can be retrieved.
513
+ def self.register_handler( name )
514
+ self.config.infos[:handler_for] = name
515
+ end
516
+
517
+ # Returns the name of the specific handler.
518
+ def self.registered_handler
519
+ self.config.infos[:handler_for]
520
+ end
521
+
522
+ # Returns all handler instances as a hash. The names defined with
523
+ # HandlerPlugin#register_handler can be used to retrieve a specific handler instance.
524
+ def registered_handlers
525
+ if !defined?( @registered_handlers_cache ) || @cached_plugins_hash != @plugin_manager.plugins.keys.hash
526
+ @registered_handlers_cache = {}
527
+ @plugin_manager.plugins.each do |name, plugin|
528
+ if plugin.kind_of?( self.class ) && plugin.class.registered_handler
529
+ @registered_handlers_cache[plugin.class.registered_handler] = plugin
530
+ end
531
+ end
532
+ @cached_plugins_hash = @plugin_manager.plugins.keys.hash
533
+ end
534
+ @registered_handlers_cache
535
+ end
536
+
537
+ end
538
+
539
+ # This module should be included by classes derived from CommandParser::Command as it
540
+ # automatically adds an object of the class to the main CommandParser object. However, the
541
+ # +super+ call in the +initialize+ method calls the method from PluginDefs, you need to call
542
+ # +superclass_init+ to call the original +initialize+ method from the super class.
543
+ module CommandPlugin
544
+
545
+ def self.append_features( klass )
546
+ klass.instance_eval {alias_method( :superclass_initialize, :initialize )}
547
+ super
548
+ PluginDefs.append_features( klass )
549
+ end
550
+
551
+ end
552
+
231
553
  end
232
554
 
233
- require 'webgen/plugins/coreplugins/logging'
234
- require 'webgen/plugins/coreplugins/configuration'
555
+ def self.init_default_plugin_loader( mod = DEFAULT_WRAPPER_MODULE, block = DEFAULT_PLUGIN_LOAD_PROC )
556
+ loader = PluginLoader.new( mod )
557
+ loader.load_from_block( &block )
558
+ loader
559
+ end
235
560
 
236
- end
561
+ def self.load_default_plugins( loader = DEFAULT_PLUGIN_LOADER )
562
+ loader.load_from_dir( File.join( File.dirname( __FILE__ ), 'plugins' ),
563
+ File.dirname( __FILE__ ).sub( /webgen$/, '' ) )
564
+ end
237
565
 
566
+ # Set this constant to +false+ before requiring the file to not load the default plugins.
567
+ LOAD_DEFAULT_PLUGINS = true unless defined?( LOAD_DEFAULT_PLUGINS )
238
568
 
569
+ # Default PluginLoader instance responsible for loading all plugins shipped with webgen.
570
+ DEFAULT_WRAPPER_MODULE = Module.new
571
+ DEFAULT_PLUGIN_LOADER = init_default_plugin_loader
572
+ load_default_plugins if LOAD_DEFAULT_PLUGINS
573
+
574
+ end