webgen 0.3.8 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: copy.rb 369 2005-12-24 11:37:40Z thomas $
4
+ # $Id: copy.rb 538 2006-12-18 08:52:02Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -21,37 +21,59 @@
21
21
  #
22
22
 
23
23
  require 'fileutils'
24
- require 'webgen/plugins/filehandlers/filehandler'
24
+ require 'erb'
25
+ load_plugin 'webgen/plugins/filehandlers/filehandler'
25
26
 
26
27
  module FileHandlers
27
28
 
28
- # A simple file handler which copies files with a specific extension from the source to the output
29
- # directory. The extensions of the files to copy are customizable.
30
- class CopyFileHandler < DefaultFileHandler
29
+ # A simple file handler which copies files specified by a pattern from the source to the output
30
+ # directory.
31
+ class CopyHandler < DefaultHandler
31
32
 
32
- summary "Copies files from source to destination without modification"
33
- add_param 'paths', ['**/*.css', '**/*.jpg', '**/*.png', '**/*.gif'], \
34
- 'The path patterns which should match the files that should get copied by this handler.'
35
- depends_on 'FileHandler'
33
+ infos( :name => 'File/CopyHandler',
34
+ :author => Webgen::AUTHOR,
35
+ :summary => "Copies files from source to destination"
36
+ )
36
37
 
37
- def initialize
38
+ param 'paths', ['**/*.css', '**/*.js', '**/*.jpg', '**/*.png', '**/*.gif'], 'The path patterns ' +
39
+ 'which match the files that should get copied by this handler.'
40
+
41
+ param 'erbPaths', ['**/*.rhtml', '**/*.rcss'], 'The path patterns which match the files ' +
42
+ 'that should get preprocessed by ERB. The leading letter r is removed from the extension.'
43
+
44
+ def initialize( plugin_manager )
38
45
  super
39
- get_param( 'paths' ).each do |path|
40
- self.class.handle_path( path )
41
- end
46
+ param( 'paths' ).each {|path| register_path_pattern( path ) }
47
+ param( 'erbPaths' ).each {|path| register_path_pattern( path ) }
42
48
  end
43
49
 
44
- def create_node( srcName, parent )
45
- node = Node.new( parent )
46
- node['dest'] = node['src'] = node['title'] = File.basename( srcName )
47
- node['processor'] = self
50
+ def create_node( path, parent, meta_info )
51
+ processWithErb = param( 'erbPaths' ).any? {|pattern| File.fnmatch( pattern, path, File::FNM_DOTMATCH )}
52
+ name = File.basename( path )
53
+ name = name.sub( /\.r([^.]+)$/, '.\1' ) if processWithErb
54
+
55
+ node = parent.find {|c| c =~ name }
56
+ if node.nil?
57
+ node = Node.new( parent, name )
58
+ node['title'] = name
59
+ node.meta_info.update( meta_info )
60
+ node.node_info[:src] = path
61
+ node.node_info[:processor] = self
62
+ node.node_info[:preprocess] = processWithErb
63
+ else
64
+ log(:warn) { "Can't create node <#{node.full_path}> as it already exists (node handled by #{node.node_info[:processor].class.plugin_name})!" }
65
+ end
48
66
  node
49
67
  end
50
68
 
51
69
  # Copy the file to the destination directory if it has been modified.
52
70
  def write_node( node )
53
- if Webgen::Plugin['FileHandler'].file_modified?( node.recursive_value( 'src' ), node.recursive_value( 'dest' ) )
54
- FileUtils.cp( node.recursive_value( 'src' ), node.recursive_value( 'dest' ) )
71
+ if @plugin_manager['Core/FileHandler'].file_modified?( node.node_info[:src], node.full_path )
72
+ if node.node_info[:preprocess]
73
+ File.open( node.full_path, 'w+' ) {|f| f.write( ERB.new( File.read( node.node_info[:src] ) ).result( binding ) ) }
74
+ else
75
+ FileUtils.cp( node.node_info[:src], node.full_path )
76
+ end
55
77
  end
56
78
  end
57
79
 
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: directory.rb 369 2005-12-24 11:37:40Z thomas $
4
+ # $Id: directory.rb 548 2006-12-23 14:45:53Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -20,40 +20,45 @@
20
20
  #++
21
21
  #
22
22
 
23
- require 'webgen/plugins/filehandlers/filehandler'
23
+ load_plugin 'webgen/plugins/filehandlers/filehandler.rb'
24
+ require 'webgen/node'
24
25
 
25
26
  module FileHandlers
26
27
 
27
28
  # Handles directories.
28
- class DirectoryHandler < DefaultFileHandler
29
+ class DirectoryHandler < DefaultHandler
29
30
 
30
- # Specialized node describing a directory.
31
+ # Specialized node for a directory.
31
32
  class DirNode < Node
32
33
 
33
- def initialize( parent, name )
34
- super( parent )
35
- self['title'] = name
36
- self['src'] = self['dest'] = name + '/'
37
- self['processor'] = Webgen::Plugin['DirectoryHandler']
38
- self['int:directory?'] = true
34
+ def initialize( parent, path, meta_info = {} )
35
+ super( parent, path )
36
+ self.meta_info = meta_info
37
+ self['title'] = File.basename( path ).capitalize
39
38
  end
40
39
 
41
40
  def []( name )
42
- process_dir_index if !self.metainfo.has_key?( 'indexFile' ) && name == 'indexFile'
41
+ process_dir_index if name == 'indexFile' &&
42
+ (!self.meta_info.has_key?( 'indexFile' ) ||
43
+ (!self.meta_info['indexFile'].nil? && !self.meta_info['indexFile'].kind_of?( Node ) ) )
43
44
  super
44
45
  end
45
46
 
47
+ #######
48
+ private
49
+ #######
50
+
46
51
  def process_dir_index
47
- indexFile = Webgen::Plugin['DirectoryHandler']['indexFile']
52
+ indexFile = self.meta_info['indexFile']
48
53
  if indexFile.nil?
49
54
  self['indexFile'] = nil
50
55
  else
51
- node = node_for_string( indexFile )
56
+ node = resolve_node( indexFile )
52
57
  if node
53
- self.logger.info { "Directory index file for <#{self.recursive_value( 'src' )}> => <#{node.recursive_value( 'src', false )}>" }
58
+ node_info[:processor].log(:info) { "Directory index file for <#{self.full_path}> => <#{node.full_path}>" }
54
59
  self['indexFile'] = node
55
60
  else
56
- self.logger.warn { "No directory index file found for directory <#{self.recursive_value( 'src' )}>" }
61
+ node_info[:processor].log(:warn) { "No directory index file found for directory <#{self.full_path}>" }
57
62
  self['indexFile'] = nil
58
63
  end
59
64
  end
@@ -62,61 +67,58 @@ module FileHandlers
62
67
  end
63
68
 
64
69
 
65
- summary "Handles directories"
66
- handle_path '**/'
67
- add_param 'indexFile', 'index.page', 'The default file name for the directory index page file.'
68
- depends_on 'FileHandler'
69
- used_meta_info 'indexFile', 'directoryName'
70
+ infos( :name => 'File/DirectoryHandler',
71
+ :author => Webgen::AUTHOR,
72
+ :summary => "Handles directories"
73
+ )
74
+
75
+ default_meta_info( { 'indexFile' => 'index.page' } )
76
+
77
+ register_path_pattern '**/', 0
78
+
70
79
 
71
- # Return a new DirNode.
72
- def create_node( path, parent )
73
- unless parent && node = parent.find {|child| /^#{File.basename( path )}\/$/ =~ child['src'] }
74
- node = DirNode.new( parent, File.basename( path ) )
80
+ # Returns a new DirNode.
81
+ def create_node( path, parent, meta_info )
82
+ filename = File.basename( path ) + '/'
83
+ if parent.nil? || (node = parent.find {|child| child =~ filename }).nil?
84
+ node = DirNode.new( parent, filename, meta_info )
85
+ node.node_info[:processor] = self
86
+ node.node_info[:src] = path
75
87
  end
76
88
  node
77
89
  end
78
90
 
79
- # Create the directory (and all its parent directories if necessary).
91
+ # Creates the directory (and all its parent directories if necessary).
80
92
  def write_node( node )
81
- name = node.recursive_value( 'dest' )
82
- FileUtils.makedirs( name ) unless File.exists?( name )
93
+ FileUtils.makedirs( node.full_path ) unless File.exists?( node.full_path )
83
94
  end
84
95
 
85
96
  # Return the page node for the directory +node+ using the specified language +lang+. If an
86
97
  # index file is specified, then the its correct language node is returned, else +node+ is
87
98
  # returned.
88
- def get_node_for_lang( node, lang )
89
- if node['indexFile']
90
- node['indexFile']['processor'].get_node_for_lang( node['indexFile'], lang )
91
- else
92
- node
93
- end
99
+ def node_for_lang( node, lang )
100
+ langnode = node['indexFile'].node_for_lang( lang ) if node['indexFile']
101
+ langnode || node
94
102
  end
95
103
 
96
- # Get the HTML link for the directory +node+.
97
- def get_html_link( node, refNode, title = nil )
98
- lang_node = get_node_for_lang( node, refNode['lang'] )
99
- title ||= lang_node['directoryName'] || node['title']
100
- super( lang_node, refNode, title )
104
+ # See DefaultFileHandler#link_from and PageHandler#link_from.
105
+ def link_from( node, ref_node, attr = {} )
106
+ lang_node = (attr[:resolve_lang_node] == false ? node : node.node_for_lang( ref_node['lang'] ) )
107
+ attr[:link_text] ||= lang_node['directoryName'] || node['title']
108
+ super( lang_node, ref_node, attr )
101
109
  end
102
110
 
103
- # Recursively create a given path
111
+ # Recursively creates a given directory path starting from the path of +parent+ and returns the
112
+ # bottom most directory node.
104
113
  def recursive_create_path( path, parent )
105
- p = parent
106
- node = nil
107
114
  path.split( File::SEPARATOR ).each do |pathname|
108
115
  case pathname
109
- when '.' then
110
- # do nothing
111
- when '..' then
112
- p = p.parent
113
- else
114
- node = create_node( pathname, p )
115
- p.add_child( node ) unless p.nil? || node.nil?
116
- p = node
116
+ when '.' then #do nothing
117
+ when '..' then parent = parent.parent
118
+ else parent = @plugin_manager['Core/FileHandler'].create_node( pathname, parent, self )
117
119
  end
118
120
  end
119
- node
121
+ parent
120
122
  end
121
123
 
122
124
  end
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: filehandler.rb 369 2005-12-24 11:37:40Z thomas $
4
+ # $Id: filehandler.rb 577 2007-01-04 20:09:28Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -21,182 +21,366 @@
21
21
  #
22
22
 
23
23
  require 'set'
24
+ require 'yaml'
25
+ require 'webgen/node'
24
26
  require 'webgen/listener'
27
+ require 'webgen/languages'
25
28
 
26
29
  module FileHandlers
27
30
 
31
+ # The main plugin for handling files.
32
+ #
33
+ # The following message listening hooks (defined via symbols) are available for this plugin
34
+ # (see Listener):
35
+ #
36
+ # +before_node_created+:: called before a node is created
37
+ # +after_node_created+:: called after a node has been created
38
+ # +after_all_nodes_created+:: called after the plugin has finfished reading in all files and the
39
+ # output backing section of the meta information file has been processed
40
+ # +before_node_written+:: called before a node is written out
41
+ # +after_node_written+:: called after a node has been written out
42
+ # +before_all_nodes_written+:: called before the plugin starts writing out the files
43
+ # +after_all_nodes_written+:: called after the plugin has finfished writing out the files
28
44
  class FileHandler < Webgen::Plugin
29
45
 
30
- summary "Super plugin for handling files"
31
- description "Provides interface on file level. The FileHandler goes through the source
32
- directory, reads in all files for which approriate plugins exist and
33
- builds the tree. When all approriate transformations on the tree have
34
- been performed the FileHandler is used to write the output files.
35
- ".gsub( /^\s+/, '' ).gsub( /\n/, ' ' )
36
- add_param 'ignorePaths', ['**/.svn{/**/**,/}', '**/CVS{/**/**,/}'], 'An array of path patterns which match files that should ' \
37
- 'be excluded from the list of \'to be processed\' files.'
46
+ infos( :name => 'Core/FileHandler',
47
+ :author => Webgen::AUTHOR,
48
+ :summary => "Main plugin for handling the files in the source directory"
49
+ )
50
+
51
+ param 'ignorePaths', ['**/CVS{/**/**,/}'], 'An array of path patterns which match files ' +
52
+ 'that should be excluded from the list of \'to be processed\' files.'
53
+
54
+ param 'defaultMetaInfo', {}, 'The keys for this hash are the names of file handlers, the ' +
55
+ 'values hashes with meta data.'
56
+
57
+ depends_on 'Core/Configuration'
38
58
 
39
59
  include Listener
40
60
 
41
- def initialize
42
- add_msg_name( :AFTER_ALL_READ )
43
- add_msg_name( :AFTER_ALL_WRITTEN )
61
+ def initialize( manager )
62
+ super
63
+ add_msg_name( :before_node_created )
64
+ add_msg_name( :after_node_created )
65
+ add_msg_name( :after_all_nodes_created )
66
+ add_msg_name( :before_node_written )
67
+ add_msg_name( :after_node_written )
68
+ add_msg_name( :before_all_nodes_written )
69
+ add_msg_name( :after_all_nodes_written )
70
+ load_meta_info_backing_file
44
71
  end
45
72
 
46
- # Builds the tree with all the nodes and returns it.
47
- def build_tree
48
- allFiles = get_files_for_pattern( File.join( '**', '{.[^.]**/**/**,**}' ) )
49
- get_param( 'ignorePaths' ).each do |pattern|
50
- allFiles.subtract( get_files_for_pattern( pattern ) )
73
+ # Renders the whole website.
74
+ def render_site
75
+ tree = build_tree
76
+ #TODO
77
+ #transform tree???
78
+ write_tree( tree ) unless tree.nil?
79
+ end
80
+
81
+ # Renders only the given +files+.
82
+ def render_files( files )
83
+ tree = build_tree
84
+ return unless tree.nil?
85
+ files.each do |file|
86
+ node = tree.resolve_node( file )
87
+ if !node.nil?
88
+ write_node( node.parent ) if !node.parent.nil? && node.parent.is_directory?
89
+ write_node( node )
90
+ end
51
91
  end
92
+ end
52
93
 
53
- handlerFiles = sort_file_handlers( FileHandlers::DefaultFileHandler.get_file_handlers ).collect do |pattern, handler|
54
- [get_files_for_pattern( pattern ), Webgen::Plugin.config[handler].obj]
94
+ # Returns true if the file +src+ is newer than +dest+ and therefore has been modified since the
95
+ # last execution of webgen. The +mtime+ values for the source and destination files are used to
96
+ # find this out.
97
+ def file_modified?( src, dest )
98
+ if File.exists?( dest ) && ( File.mtime( src ) <= File.mtime( dest ) )
99
+ log(:info) { "File is up to date: <#{dest}>" }
100
+ return false
101
+ else
102
+ return true
55
103
  end
104
+ end
56
105
 
57
- rootPath = Webgen::Plugin['Configuration']['srcDirectory'] + File::SEPARATOR
58
- rootHandler = handler_for_path( rootPath, handlerFiles )
59
- if rootHandler.nil? || allFiles.empty?
60
- logger.error { "No file handler for root directory <#{rootPath}> found" } if rootHandler.nil? && !allFiles.empty?
61
- logger.error { "No files found in directory <#{rootPath}>" } if allFiles.empty?
62
- return nil
106
+ # Returns the meta info for nodes for the given +handler+. If +file+ is specified, meta
107
+ # information from the backing file is also used if available (using files specified in the
108
+ # source block of the backing file). The parameter +file+ has to be an absolute path, ie.
109
+ # starting with a slash.
110
+ def meta_info_for( handler, file = nil )
111
+ info = (handler.class.config.infos[:default_meta_info] || {}).dup
112
+ info.update( param('defaultMetaInfo')[handler.class.plugin_name] || {} )
113
+ if file
114
+ file = normalize_path( file )
115
+ if @source_backing.has_key?( file )
116
+ info.update( @source_backing[file] )
117
+ end
63
118
  end
119
+ info
120
+ end
64
121
 
65
- logger.debug { "Using plugin #{rootHandler.class.name} for handling the root node" }
66
- root = create_root_node( rootPath, rootHandler )
67
- allFiles.subtract( [rootPath] )
68
- handlerFiles.find {|files, handler| handler == rootHandler}[0].subtract( [rootPath] )
69
-
70
- handlerFiles.each do |files, handler|
71
- commonFiles = allFiles & files
72
- allFiles.subtract( commonFiles )
73
- diffFiles = files - commonFiles
74
- logger.info { "Not handling files for #{handler.class.name} as they do not exist or are excluded: #{diffFiles.inspect}" } if diffFiles.length > 0
75
- commonFiles.each {|file| build_entry( file, root, handler, handlerFiles ) }
122
+ # Creates a node for +file+ (creating parent directories apropriately) under +parent_node+ using
123
+ # the given +handler+. If a block is given, then the block is used to create the node which is
124
+ # useful if you want a custom node creation method.
125
+ def create_node( file, parent_node, handler ) # :yields: file, parent_node, handler, meta_info
126
+ pathname, filename = File.split( file )
127
+ parent_node = @plugin_manager['File/DirectoryHandler'].recursive_create_path( pathname, parent_node )
128
+
129
+ meta_info = meta_info_for( handler, File.join( parent_node.absolute_path, filename ) )
130
+
131
+ src_path = File.join( Node.root( parent_node ).node_info[:src], parent_node.absolute_path, filename )
132
+ dispatch_msg( :before_node_created, src_path, parent_node, handler, meta_info )
133
+ if block_given?
134
+ node = yield( src_path, parent_node, handler, meta_info )
135
+ else
136
+ node = handler.create_node( src_path, parent_node, meta_info )
76
137
  end
138
+ check_node( node ) unless node.nil?
77
139
 
78
- dispatch_msg( :AFTER_ALL_READ, root )
79
- logger.info { "No handlers found for files: #{allFiles.inspect}" } if allFiles.length > 0
140
+ dispatch_msg( :after_node_created, node ) unless node.nil?
80
141
 
81
- root
142
+
143
+ node
82
144
  end
83
145
 
146
+ #######
147
+ private
148
+ #######
149
+
150
+ # Used to check that certain meta/node information is available and correct.
151
+ def check_node( node )
152
+ node['lang'] = Webgen::LanguageManager.language_for_code( node['lang'] ) unless node['lang'].kind_of?( Webgen::Language )
153
+ node['title'] ||= node.path
154
+ end
155
+
156
+ # Returns a normalized path, ie. a path starting with a slash and any trailing slashes removed.
157
+ def normalize_path( path )
158
+ path = (path =~ /^\// ? '' : '/') + path.sub( /\/+$/, '' )
159
+ end
160
+
161
+ # Loads the meta information backing file from the website directory.
162
+ def load_meta_info_backing_file
163
+ file = File.join( param( 'websiteDir', 'Core/Configuration' ), 'metainfo.yaml' )
164
+ if File.exists?( file )
165
+ begin
166
+ index = 1
167
+ YAML::load_documents( File.read( file ) ) do |data|
168
+ if data.nil? || (data.kind_of?( Hash ) && data.all? {|k,v| v.kind_of?( Hash ) })
169
+ if index == 1
170
+ @source_backing = {}
171
+ data.each_pair {|path, metainfo| @source_backing[normalize_path(path)] = metainfo} unless data.nil?
172
+ elsif index == 2
173
+ @output_backing = data
174
+ else
175
+ log(:error) { "A backing file can only have two blocks: one for source and one for output backing!" }
176
+ end
177
+ else
178
+ log(:error) { "Content of backing file (#{index == 1 ? 'source' : 'output'} block) not correctcly structured" }
179
+ end
180
+ index += 1
181
+ end
182
+ rescue
183
+ log(:error) { "Backing file is not a valid YAML document: #{$!.message}" }
184
+ end
185
+ else
186
+ log(:info) { 'No meta information backing file found!' }
187
+ end
188
+ @source_backing ||= {}
189
+ @output_backing ||= {}
190
+ end
191
+
192
+ # Uses the output backing section of the meta information file to assign meta information or, if
193
+ # no node for a path can be found, to create virtual nodes.
194
+ def handle_output_backing( root )
195
+ @output_backing.each do |path, data|
196
+ path = path[1..-1] if path =~ /^\//
197
+ if node = root.resolve_node( path )
198
+ node.meta_info.update( data )
199
+ else
200
+ node = create_node( path, root, @plugin_manager['File/VirtualFileHandler'] ) do |src, parent, handler, meta_info|
201
+ meta_info = meta_info.merge( data )
202
+ handler.create_node( src, parent, meta_info )
203
+ end
204
+ end
205
+ check_node( node )
206
+ end
207
+ end
208
+
209
+ # Reads all files from the source directory and constructs the node tree which is returned.
210
+ def build_tree
211
+ all_files = find_all_files()
212
+ return if all_files.empty?
213
+
214
+ files_for_handlers = find_files_for_handlers()
215
+
216
+ root_node = create_root_node()
217
+
218
+ used_files = Set.new
219
+ files_for_handlers.sort {|a,b| a[0] <=> b[0]}.each do |rank, handler, files|
220
+ log(:debug) { "Creating nodes for #{handler.class.plugin_name} with rank #{rank}" }
221
+ common = all_files & files
222
+ used_files += common
223
+ diff = files - common
224
+ log(:info) { "Not using these files for #{handler.class.plugin_name} as they do not exist or are excluded: #{diff.inspect}" } if diff.length > 0
225
+ common.each do |file|
226
+ log(:info) { "Creating node(s) for file <#{file}>..." }
227
+ create_node( file.sub( /^#{root_node.node_info[:src]}/, '' ), root_node, handler )
228
+ end
229
+ end
230
+
231
+ unused_files = all_files - used_files
232
+ log(:info) { "No handlers found for: #{unused_files.inspect}" } if unused_files.length > 0
233
+
234
+ handle_output_backing( root_node )
235
+ dispatch_msg( :after_all_nodes_created, root_node )
236
+
237
+ root_node
238
+ end
84
239
 
85
240
  # Recursively writes out the tree specified by +node+.
86
241
  def write_tree( node )
87
- self.logger.info { "Writing <#{node.recursive_value('dest')}>" }
242
+ dispatch_msg( :before_all_nodes_written, node ) if node.parent.nil?
88
243
 
89
- node['processor'].write_node( node )
244
+ write_node( node )
245
+ node.each {|child| write_tree( child ) }
90
246
 
91
- node.each do |child|
92
- write_tree( child )
93
- end
247
+ dispatch_msg( :after_all_nodes_written, node ) if node.parent.nil?
248
+ end
94
249
 
95
- dispatch_msg( :AFTER_ALL_WRITTEN ) if node.parent.nil?
250
+ # Writes out the given +node+.
251
+ def write_node( node )
252
+ log(:info) { "Writing <#{node.full_path}>" }
253
+ dispatch_msg( :before_node_written, node )
254
+ node.write_node
255
+ dispatch_msg( :after_node_written, node )
96
256
  end
97
257
 
258
+ # Creates a set of all files in the source directory, removing all files which should be ignored.
259
+ def find_all_files
260
+ all_files = files_for_pattern( '**/{**,**/}' ).to_set
261
+ param( 'ignorePaths' ).each {|pattern| all_files.subtract( files_for_pattern( pattern ) ) }
262
+ log(:error) { "No files found in the source directory <#{param('srcDir', 'Core/Configuration')}>" } if all_files.empty?
263
+ all_files
264
+ end
98
265
 
99
- # Returns true if the file +src+ is newer than +dest+ and therefore has been modified since the last execution
100
- # of webgen. The +mtime+ values for the source and destination files are used to find this out.
101
- def file_modified?( src, dest )
102
- if File.exists?( dest ) && ( File.mtime( src ) < File.mtime( dest ) )
103
- self.logger.info { "File is up to date: <#{dest}>" }
104
- return false
105
- else
106
- return true
266
+ # Finds the files for each registered handler plugin and stores them in a Hash with the plugin
267
+ # as key.
268
+ def find_files_for_handlers
269
+ files_for_handlers = []
270
+ @plugin_manager.plugins.each do |name, plugin|
271
+ files_for_plugin = Set.new
272
+ if plugin.kind_of?( DefaultHandler )
273
+ plugin.path_patterns.each do |rank, pattern|
274
+ files = files_for_pattern( pattern ) - files_for_plugin
275
+ files_for_handlers << [rank, plugin, files ] unless files.empty?
276
+ files_for_plugin += files
277
+ end
278
+ end
107
279
  end
280
+ files_for_handlers
108
281
  end
109
282
 
110
- #######
111
- private
112
- #######
113
-
114
- def get_files_for_pattern( pattern )
115
- files = Dir[File.join( Webgen::Plugin['Configuration']['srcDirectory'], pattern )].to_set
283
+ # Returns an array of files of the source directory matching +pattern+
284
+ def files_for_pattern( pattern )
285
+ files = Dir[File.join( param( 'srcDir', 'Core/Configuration' ), pattern )].to_set
286
+ files.delete( File.join( param( 'srcDir', 'Core/Configuration' ), '/' ) )
116
287
  files.collect! do |f|
117
288
  f = f.sub( /([^.])\.{1,2}$/, '\1' ) # remove '.' and '..' from end of paths
118
- f += File::SEPARATOR if File.directory?( f ) && ( f[-1] != ?/ )
289
+ f += '/' if File.directory?( f ) && ( f[-1] != ?/ )
119
290
  f
120
291
  end
121
292
  files
122
293
  end
123
294
 
124
- def create_root_node( path, handler )
125
- root = handler.create_node( path, nil )
295
+ # Creates the root node.
296
+ def create_root_node
297
+ root_path = File.join( param( 'srcDir', 'Core/Configuration' ), '/' )
298
+ root_handler = @plugin_manager['File/DirectoryHandler']
299
+ if root_handler.nil?
300
+ log(:error) { "No handler for root directory <#{root_path}> found" }
301
+ return nil
302
+ end
303
+
304
+ root = root_handler.create_node( root_path, nil, meta_info_for( root_handler, '/' ) )
126
305
  root['title'] = ''
127
- root['dest'] = Webgen::Plugin['Configuration']['outDirectory'] + '/'
128
- root['src'] = Webgen::Plugin['Configuration']['srcDirectory'] + '/'
306
+ root.path = File.join( param( 'outDir', 'Core/Configuration' ), '/' )
307
+ root.node_info[:src] = root_path
308
+
129
309
  root
130
310
  end
131
311
 
132
- def build_entry( file, root, handler, handlerFiles )
133
- pathname, filename = File.split( file )
134
- pathname = pathname + '/'
135
- treeFile = file.sub( /^#{root['src']}/, '' )
136
- treePath = pathname.sub( /^#{root['src']}/, '' )
137
-
138
- node = root.node_for_string?( treeFile, 'src' )
139
- return node unless node.nil?
140
- logger.info { "Processing <#{file}> with #{handler.class.name} ..." }
141
-
142
- parentNode = root.node_for_string?( treePath )
143
- if parentNode.nil?
144
- if pathname == root['src']
145
- parentNode = root
146
- else
147
- logger.debug { "Parent node for <#{file}> does not exist, create node for path <#{pathname}>" }
148
- parentNode = build_entry( pathname, root, handler_for_path( pathname, handlerFiles ), handlerFiles )
149
- end
150
- end
151
- raise "Parent node is nil" if parentNode.nil?
152
- logger.info { "Creating node for <#{file}>..." }
153
- n = handler.create_node( file, parentNode )
154
- parentNode.add_child( n ) unless n.nil?
155
- n
156
- end
312
+ end
157
313
 
158
- def handler_for_path( path, handlerFiles )
159
- temp, handler = handlerFiles.find {|p, handler| p.include?( path )}
160
- handler
161
- end
162
314
 
163
- def sort_file_handlers( handlers )
164
- handlers.sort {|a,b| a[0].count( "?*" ) <=> b[0].count( "?*" )}
165
- end
315
+ # The default handler which is the super class of all file handlers. It defines methods thata
316
+ # should be used by the subclasses to specify which files should be handled. There are two types
317
+ # of path patterns: constant ones defined using the class methods and dynamic ones defined using
318
+ # the instance methods. The dynamic path patterns should be defined during the initialization!
319
+ #
320
+ # During a webgen run the FileHandler retrieves all plugins which derive from the DefaultHandler
321
+ # and uses the constant and dynamic path patterns defined for each file handler plugin for finding
322
+ # the handled files.
323
+ class DefaultHandler < Webgen::Plugin
166
324
 
167
- end
325
+ EXTENSION_PATH_PATTERN = "**/*.%s"
326
+ DEFAULT_RANK = 100
327
+
328
+ infos( :name => 'File/DefaultHandler',
329
+ :author => Webgen::AUTHOR,
330
+ :summary => "Base class of all file handler plugins",
331
+ :instantiate => false
332
+ )
333
+
334
+ param 'linkToCurrentPage', false, 'Specifies whether in menus, breadcrumb trails, etc. a real link to ' +
335
+ 'the current page should be used or only the link text.'
168
336
 
169
- # The default handler which is the super class of all file handlers.
170
- class DefaultFileHandler < Webgen::Plugin
171
337
 
172
- summary "Base class of all file handler plugins"
338
+ # Specify the path pattern which should be handled by the class. The +rank+ is used for sorting
339
+ # the patterns so that the creation order of nodes can be influenced. If a file is matched by
340
+ # more than one path pattern defined by a single file handler plugin, it is only used once for
341
+ # the first pattern.
342
+ def self.register_path_pattern( path, rank = DEFAULT_RANK )
343
+ (self.config.infos[:path_patterns] ||= []) << [rank, path]
344
+ end
345
+
346
+ # Specify the files handled by the class via the extension. The parameter +ext+ should be the
347
+ # pure extension without the dot. Also see DefaultHandler.register_path_pattern !
348
+ def self.register_extension( ext, rank = DEFAULT_RANK )
349
+ register_path_pattern( EXTENSION_PATH_PATTERN % [ext], rank )
350
+ end
173
351
 
174
- VIRTUAL = true
352
+ # See DefaultHandler.register_path_pattern
353
+ def register_path_pattern( path, rank = DEFAULT_RANK )
354
+ (@path_patterns ||= []) << [rank, path]
355
+ end
356
+ protected :register_path_pattern
175
357
 
176
- # Specify the extension which should be handled by the class.
177
- def self.handle_path( path )
178
- logger.info { "Registering class #{self.name} for handling the path pattern: #{path.inspect}" }
179
- (self.config[self].path ||= []) << path
180
- handlers = (self.config[DefaultFileHandler].file_handler ||= {})
181
- logger.warn { "Path pattern #{path} already associated with class #{handlers[path].name}, not using class #{self.name} for it!" } if handlers[path]
182
- handlers[path] ||= self
358
+ # See DefaultHandler.register_extension
359
+ def register_extension( ext, rank = DEFAULT_RANK )
360
+ register_path_pattern( EXTENSION_PATH_PATTERN % [ext], rank )
183
361
  end
362
+ protected :register_extension
184
363
 
185
- # Specify the files handled by the class via the extension.
186
- def self.extension( ext )
187
- handle_path( "**/{.[^.]**/**/*.#{ext},*.#{ext}}" )
364
+ # Returns all (i.e. static and dynamic) path patterns defined for the file handler.
365
+ def path_patterns
366
+ (self.class.config.infos[:path_patterns] || []) + (@path_patterns ||= [])
188
367
  end
189
368
 
190
- # Return the registered file handler plugins.
191
- def self.get_file_handlers
192
- self.config[self].file_handler
369
+ # Sets the default meta information for the file handler. This meta information can later be
370
+ # overridden by the +Core/FileHandler:defaultMetaInfo+ parameter and values set in the meta
371
+ # information backing file. The so updated meta information is then passed to the #create_node
372
+ # method.
373
+ def self.default_meta_info( hash )
374
+ self.config.infos[:default_meta_info] = hash
193
375
  end
194
376
 
195
- # Supplies the +path+ to a file and the +parent+ node sothat the plugin can create a node for this
196
- # path. Should return the node for the path or nil if the node could not be created.
377
+ # Asks the plugin to create a node for the given +path+ and the +parent+, using +meta_info+ as
378
+ # default meta data for the node. Should return the node for the path (the newly created node
379
+ # or, if a node with the path already exists, the existing one) or +nil+ if the node could not
380
+ # be created.
197
381
  #
198
382
  # Has to be overridden by the subclass!!!
199
- def create_node( path, parent )
383
+ def create_node( path, parent, meta_info )
200
384
  raise NotImplementedError
201
385
  end
202
386
 
@@ -207,15 +391,78 @@ module FileHandlers
207
391
  raise NotImplementedError
208
392
  end
209
393
 
210
- # Returns the node for the language +lang+ which is equal to this +node+.
211
- def get_node_for_lang( node, lang )
394
+ # Returns the node which has the same data as +node+ but in language +lang+; or +nil+ if such a
395
+ # node does not exist. The default behaviour assumes that +node+ has the data for all languages.
396
+ def node_for_lang( node, lang )
212
397
  node
213
398
  end
214
399
 
215
- # Returns a HTML link for the given +node+ relative to +refNode+. You can optionally specify the
216
- # title for the link. If not specified, the title of the node is used.
217
- def get_html_link( node, refNode, title = node['title'] )
218
- "<a href=\"#{refNode.relpath_to_node( node )}\" title=\"#{title}\">#{title}</a>"
400
+ # Returns a HTML link to the +node+ from +ref_node+ or, if +node+ and +ref_node+ are the same
401
+ # and the parameter +linkToCurrentPage+ is +false+, a +span+ element with the link text.
402
+ #
403
+ # You can optionally specify additional attributes for the html element in the +attr+ Hash.
404
+ # Also, the meta information +linkAttrs+ of the given +node+ is used, if available, to set
405
+ # attributes. However, the +attr+ parameter takes precedence over the +linkAttrs+ meta
406
+ # information. If the special value +:link_text+ is present in the attributes, it will be used
407
+ # as the link text; otherwise the title of the +node+ will be used. Be aware that all key-value
408
+ # pairs with Symbol keys are removed before the attributes are written. Therefore you always
409
+ # need to specify general attributes with Strings!
410
+ def link_from( node, ref_node, attr = {} )
411
+ attr = node['linkAttrs'].merge( attr ) if node['linkAttrs'].kind_of?( Hash )
412
+ link_text = attr[:link_text] || node['title']
413
+ attr.delete_if {|k,v| k.kind_of?( Symbol )}
414
+
415
+ use_link = ( node != ref_node || param( 'linkToCurrentPage' ) )
416
+ attr['href'] = ref_node.route_to( node ) if use_link
417
+ attrs = attr.collect {|name,value| "#{name.to_s}=\"#{value}\"" }.sort.unshift( '' ).join( ' ' )
418
+ ( use_link ? "<a#{attrs}>#{link_text}</a>" : "<span#{attrs}>#{link_text}</span>" )
419
+ end
420
+
421
+ end
422
+
423
+
424
+ # Handles virtual nodes created via the output backing section of the meta information backing
425
+ # file.
426
+ class VirtualFileHandler < DefaultHandler
427
+
428
+ # A virtual node.
429
+ class VirtualNode < ::Node
430
+
431
+ # Overridden to also match the +reference+ path of the virtual node.
432
+ def =~( path )
433
+ md = /^(#{@path}|#{@node_info[:reference]})(?=#|$)/ =~ path
434
+ ( md ? $& : nil )
435
+ end
436
+
437
+ end
438
+
439
+ infos( :name => 'File/VirtualFileHandler',
440
+ :author => Webgen::AUTHOR,
441
+ :summary => 'Handles virtual files specified in the backing file'
442
+ )
443
+
444
+ def create_node( path, parent, meta_info )
445
+ filename = File.basename( path )
446
+ filename, reference = (meta_info['url'] ? [meta_info['url'], filename] : [filename, filename])
447
+
448
+ # no need to check for an existing nodes, that is already done in FileHandler#handle_output_backing
449
+ temp_node = VirtualNode.new( parent, reference )
450
+ resolved_node = temp_node.resolve_node( filename )
451
+ if resolved_node
452
+ node = VirtualNode.new( parent, temp_node.route_to( resolved_node ) )
453
+ else
454
+ node = VirtualNode.new( parent, filename )
455
+ end
456
+ parent.del_child( temp_node )
457
+
458
+ node.meta_info.update( meta_info )
459
+ node.node_info[:reference] = reference
460
+ node.node_info[:processor] = self
461
+ node
462
+ end
463
+
464
+ def write_node( node )
465
+ # nothing to write
219
466
  end
220
467
 
221
468
  end