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: composite.rb 369 2005-12-24 11:37:40Z thomas $
4
+ # $Id: composite.rb 402 2006-04-07 15:21:41Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -45,16 +45,16 @@ module Composite
45
45
 
46
46
  # Returns the array of children
47
47
  def children
48
- @children = [] unless defined? @children
48
+ @children = [] unless defined?( @children )
49
49
  @children
50
50
  end
51
51
 
52
52
 
53
53
  # Adds all objects in the array
54
54
  def add_children( array )
55
- if array.kind_of? Array
56
- @children = [] unless defined? @children
57
- @children.concat array
55
+ if array.kind_of?( Array )
56
+ @children = [] unless defined?( @children )
57
+ @children.concat( array.compact )
58
58
  else
59
59
  raise ArgumentError, "Parameter must be array"
60
60
  end
@@ -69,8 +69,8 @@ module Composite
69
69
 
70
70
  # Adds the child
71
71
  def add_child( child )
72
- @children = [] unless defined? @children
73
- @children.push child unless @children.include? child
72
+ @children = [] unless defined?( @children )
73
+ @children.push( child ) unless child.nil? || @children.include?( child )
74
74
  end
75
75
 
76
76
 
@@ -79,17 +79,17 @@ module Composite
79
79
  # [+Numeric+] the child at the specified position is deleted
80
80
  # [+else+] the specified child is deleted
81
81
  def del_child( child )
82
- if child.kind_of? Numeric
83
- @children.delete_at child if defined? @children
82
+ if child.kind_of?( Numeric )
83
+ @children.delete_at( child ) if defined?( @children )
84
84
  else
85
- @children.delete child if defined? @children
85
+ @children.delete( child ) if defined?( @children )
86
86
  end
87
87
  end
88
88
 
89
89
 
90
90
  # Iterates over all childrenldren
91
91
  def each # :yields: child
92
- children.each do |child| yield child end if defined? @children
92
+ @children.each {|child| yield child } if defined?( @children )
93
93
  end
94
94
 
95
95
 
@@ -0,0 +1,52 @@
1
+ #
2
+ #--
3
+ #
4
+ # $Id: config.rb 531 2006-11-17 17:56:14Z thomas $
5
+ #
6
+ # webgen: template based static website generator
7
+ # Copyright (C) 2004 Thomas Leitner
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify it under the terms of the GNU
10
+ # General Public License as published by the Free Software Foundation; either version 2 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
14
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ # General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along with this program; if not,
18
+ # write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ #
20
+ #++
21
+ #
22
+
23
+ require 'rbconfig'
24
+
25
+ module Webgen
26
+
27
+ VERSION = [0, 4, 0]
28
+ AUTHOR = 'Thomas Leitner <t_leitner@gmx.at>'
29
+ SUMMARY = "webgen is a templated based static Web site generator."
30
+ DESCRIPTION = "webgen is a Web site generator implemented in Ruby. " \
31
+ "It is used to generate static Web pages from templates and page " \
32
+ "description files."
33
+
34
+ # The directory below a website directory in which the source files are.
35
+ SRC_DIR = 'src'
36
+
37
+ # The directory below a website directory in which the plugin files are.
38
+ PLUGIN_DIR = 'plugin'
39
+
40
+ # Returns the data directory for webgen.
41
+ def self.data_dir
42
+ unless defined?( @@data_dir )
43
+ @@data_dir = File.join( Config::CONFIG["datadir"], "webgen" )
44
+
45
+ @@data_dir = File.join( File.dirname( __FILE__ ), '..', '..', 'data', 'webgen') if !File.exists?( @@data_dir )
46
+
47
+ raise "Could not find webgen data directory! This is a bug, report it please!" unless File.directory?( @@data_dir )
48
+ end
49
+ @@data_dir
50
+ end
51
+
52
+ end
@@ -0,0 +1,172 @@
1
+ #
2
+ #--
3
+ #
4
+ # $Id: content.rb 576 2007-01-03 19:41:12Z thomas $
5
+ #
6
+ # webgen: template based static website generator
7
+ # Copyright (C) 2004 Thomas Leitner
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify it under the terms of the GNU
10
+ # General Public License as published by the Free Software Foundation; either version 2 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
14
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ # General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along with this program; if not,
18
+ # write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ #
20
+ #++
21
+ #
22
+
23
+ require 'yaml'
24
+ require 'erb'
25
+
26
+ # A single block within a page file. The content of the block gets automatically parsed for HTML
27
+ # headers with the id attribute set and converts them into sections for later use.
28
+ class HtmlBlock
29
+
30
+ # A section with a block. Corresponds to an HTML header with an id.
31
+ class Section
32
+
33
+ # The level of the header, ie. 1 for a h1 tag, 2, for a h2 tag, and so on.
34
+ attr_reader :level
35
+
36
+ # The id of the tag.
37
+ attr_reader :id
38
+
39
+ # The title of the tag, ie. the content between the opening and closing h[123456] tag.
40
+ attr_reader :title
41
+
42
+ # Sub sections of this section.
43
+ attr_accessor :subsections
44
+
45
+ # Creates a new Section object with the given +level+, +id+, and +title+.
46
+ def initialize( level, id, title )
47
+ @level, @id, @title = level, id, title
48
+ @subsections = []
49
+ end
50
+
51
+ end
52
+
53
+ # The name of the block.
54
+ attr_reader :name
55
+
56
+ # The content of the block.
57
+ attr_reader :content
58
+
59
+ # The parsed sections as array of Section objects.
60
+ attr_reader :sections
61
+
62
+ # Creates a new block with the name +name+ and the given +content+. The content gets parsed for
63
+ # sections automatically.
64
+ def initialize( name, content )
65
+ @name, @content = name, content
66
+ @sections = self.class.parse_sections( content )
67
+ end
68
+
69
+ # Renders the block using ERB and +context+ as binding.
70
+ def render_with_erb( context )
71
+ @compiled_block = ERB.new( @content ) unless defined?( @compiled_block )
72
+ @compiled_block.result( context )
73
+ end
74
+
75
+ #######
76
+ private
77
+ #######
78
+
79
+ SECTION_REGEXP = /<h([123456])(?:>|\s([^>]*)>)(.*?)<\/h\1\s*>/i
80
+ ATTR_REGEXP = /\s*(\w+)\s*=\s*('|")([^\2]+)\2\s*/
81
+
82
+ def self.parse_sections( content )
83
+ sections = []
84
+ stack = []
85
+ content.scan( SECTION_REGEXP ).each do |level,attrs,title|
86
+ next if attrs.nil?
87
+ id_attr = attrs.scan( ATTR_REGEXP ).find {|name,sep,value| name == 'id'}
88
+ next if id_attr.nil?
89
+ id = id_attr[2]
90
+
91
+ section = Section.new( level.to_i, id, title )
92
+ success = false
93
+ while !success
94
+ if stack.empty?
95
+ sections << section
96
+ stack << section
97
+ success = true
98
+ elsif stack.last.level < section.level
99
+ stack.last.subsections << section
100
+ stack << section
101
+ success = true
102
+ else
103
+ stack.pop
104
+ end
105
+ end
106
+ end
107
+ sections
108
+ end
109
+
110
+ end
111
+
112
+
113
+ # Raised when during parsing of data in the WebPage Description Format if the data is invalid.
114
+ class WebPageDataInvalid < RuntimeError; end
115
+
116
+
117
+ # A WebPageData object contains the parsed data of a file/string in the WebPage Description Format.
118
+ class WebPageData
119
+
120
+ # The content blocks. Access via index or name.
121
+ attr_reader :blocks
122
+
123
+ # The contents of the meta information block.
124
+ attr_reader :meta_info
125
+
126
+ # Parses the given String +data+ and initializes a new WebPageData object with the found values.
127
+ # The blocks are converted to HTML by using the provided +formatters+ hash. A key in this hash has
128
+ # to be a format name and the value and object which responds to the +call(content)+ method. You
129
+ # can set +default_meta_info+ to provide default entries for the meta information block.
130
+ def initialize( data, formatters = {'default' => proc {|c| c} }, default_meta_info = {} )
131
+ @meta_info = default_meta_info
132
+ @formatters = formatters
133
+ parse( data )
134
+ end
135
+
136
+ #######
137
+ private
138
+ #######
139
+
140
+ def parse( data )
141
+ @blocks = {}
142
+ blocks = data.scan( /(?:(?:^--- *(?:(\w+) *(?:, *(\w+) *)?)?$)|\A)(.*?)(?:(?=^---.*?$)|\Z)/m )
143
+ if data =~ /\A---\s*$/
144
+ begin
145
+ meta = YAML::load( blocks.shift[2] )
146
+ raise( WebPageDataInvalid, 'Invalid structure of meta information part') unless meta.kind_of?( Hash )
147
+ @meta_info.update( meta )
148
+ rescue ArgumentError => e
149
+ raise WebPageDataInvalid, e.message
150
+ end
151
+ end
152
+
153
+ raise( WebPageDataInvalid, 'No content blocks specified' ) if blocks.length == 0
154
+
155
+ blocks.each_with_index do |block_data, index|
156
+ name, format, content = *block_data
157
+ name = name || (@meta_info['blocks'] && @meta_info['blocks'][index] && @meta_info['blocks'][index][0]) || 'content'
158
+ raise( WebPageDataInvalid, "Same name used for more than one block: #{name}" ) if @blocks.has_key?( name )
159
+ content ||= ''
160
+ content.gsub!( /^(\\+)(---.*?)$/ ) {|m| "\\" * ($1.length / 2) + $2 }
161
+ content.strip!
162
+ format = format || (@meta_info['blocks'] && @meta_info['blocks'][index] && @meta_info['blocks'][index][1]) || 'default'
163
+ @blocks[name] = @blocks[index] = HtmlBlock.new( name, convert( content, format ) )
164
+ end
165
+ end
166
+
167
+ def convert( content, format )
168
+ raise( WebPageDataInvalid, "Invalid content format specified: #{format}" ) unless @formatters.has_key?( format )
169
+ @formatters[format].call( content )
170
+ end
171
+
172
+ end
@@ -0,0 +1,23 @@
1
+ require "tempfile"
2
+
3
+ # Allows one to get stdout and stderr from an executed command. Original version
4
+ # by Karl von Laudermann in ruby-talk #113035
5
+ class ExtendedCommand
6
+
7
+ attr_reader :ret_code, :out_text, :err_text
8
+
9
+ def initialize( command )
10
+ tempfile = Tempfile.new( 'webgen' )
11
+ tempfile.close # So that child process can write to it
12
+
13
+ # Execute command, redirecting stderr to temp file
14
+ @out_text = `#{command} 2> #{tempfile.path}`
15
+ @ret_code = $? >> 8
16
+
17
+ # Read temp file
18
+ tempfile.open
19
+ @err_text = tempfile.readlines.join
20
+ tempfile.close
21
+ end
22
+
23
+ end
@@ -0,0 +1,110 @@
1
+ #
2
+ #--
3
+ #
4
+ # $Id: languages.rb 484 2006-09-02 07:55:59Z thomas $
5
+ #
6
+ # webgen: template based static website generator
7
+ # Copyright (C) 2004 Thomas Leitner
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify it under the terms of the GNU
10
+ # General Public License as published by the Free Software Foundation; either version 2 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
14
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ # General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along with this program; if not,
18
+ # write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ #
20
+ #++
21
+ #
22
+
23
+ require 'webgen/config'
24
+
25
+ module Webgen
26
+
27
+ # Describes a human language which is uniquely identfied by a three letter code and, optionally,
28
+ # by an alternative three letter or a two letter code.
29
+ class Language
30
+
31
+ include Comparable
32
+
33
+ attr_reader :codes
34
+ attr_reader :description
35
+
36
+ # Creates a new language. +codes+ has to be an array containing three strings: the three letter
37
+ # code, the alternative three letter code and the two letter code. If one is not available for
38
+ # the language, it has to be +nil+.
39
+ def initialize( codes, description )
40
+ @codes = codes
41
+ @description = description
42
+ end
43
+
44
+ # The two letter code.
45
+ def code2chars
46
+ @codes[2]
47
+ end
48
+
49
+ # The three letter code.
50
+ def code3chars
51
+ @codes[0]
52
+ end
53
+
54
+ # The alternative three letter code.
55
+ def code3chars_alternative
56
+ @codes[1]
57
+ end
58
+
59
+ # The textual representation of the language.
60
+ def to_s
61
+ code2chars || code3chars
62
+ end
63
+
64
+ alias_method :to_str, :to_s
65
+
66
+ def inspect
67
+ "#<Language codes=#{codes.inspect} description=#{description.inspect}"
68
+ end
69
+
70
+ def <=>( other )
71
+ self.to_s <=> other.to_s
72
+ end
73
+
74
+ end
75
+
76
+
77
+ # Used for managinging human languages.
78
+ module LanguageManager
79
+
80
+ # Returns a +Language+ object for the given language code.
81
+ def self.language_for_code( code )
82
+ languages[code]
83
+ end
84
+
85
+ # Returns an array of +Language+ objects whose description match the given +text+.
86
+ def self.find_language( text )
87
+ languages.values.find_all {|lang| /.*#{Regexp.escape(text)}.*/i =~ lang.description}.uniq.sort
88
+ end
89
+
90
+ # Returns all available languages as a Hash. The keys are the language codes and the values are
91
+ # the +Language+ objects for them.
92
+ def self.languages
93
+ unless defined?( @@languages )
94
+ @@languages = {}
95
+ code_file = File.join( Webgen.data_dir, 'data', 'ISO-639-2_values_8bits.txt' )
96
+ File.readlines( code_file ).each do |l|
97
+ data = l.chomp.split( '|' ).collect {|f| f.empty? ? nil : f }
98
+ lang = Language.new( data[0..2], data[3] )
99
+ @@languages[lang.code2chars] ||= lang unless lang.code2chars.nil?
100
+ @@languages[lang.code3chars] ||= lang unless lang.code3chars.nil?
101
+ @@languages[lang.code3chars_alternative] ||= lang unless lang.code3chars_alternative.nil?
102
+ end
103
+ @@languages.freeze
104
+ end
105
+ @@languages
106
+ end
107
+
108
+ end
109
+
110
+ end
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: listener.rb 369 2005-12-24 11:37:40Z thomas $
4
+ # $Id: listener.rb 271 2005-05-09 08:50:47Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: node.rb 369 2005-12-24 11:37:40Z thomas $
4
+ # $Id: node.rb 576 2007-01-03 19:41:12Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -21,179 +21,251 @@
21
21
  #
22
22
 
23
23
  require 'uri'
24
+ require 'pathname'
24
25
  require 'webgen/composite'
25
26
 
27
+ # The Node class is used for building the internal data structure which represents the output tree.
26
28
  class Node
27
29
 
28
30
  include Composite
29
31
 
30
- attr_reader :parent
31
- attr_accessor :metainfo
32
+ # The parent node.
33
+ attr_reader :parent
32
34
 
33
- def initialize( parent )
34
- @parent = parent
35
- @metainfo = Hash.new
35
+ # The path of this node.
36
+ attr_reader :path
37
+
38
+ # Information used for processing the node.
39
+ attr_accessor :node_info
40
+
41
+ # Meta information associated with the node.
42
+ attr_accessor :meta_info
43
+
44
+ # Initializes a new Node instance.
45
+ #
46
+ # +parent+::
47
+ # if this parameter is +nil+, then the new node acts as root. Otherwise, +parent+ has to
48
+ # be a valid node instance.
49
+ # +path+::
50
+ # The path for this node. If this node is a directory, the path must have a trailing
51
+ # slash ('dir/'). If it is a fragment, the hash sign must be the first character of the
52
+ # path ('#fragment'). A compound path like 'dir/file#fragment' is also allowed as are
53
+ # absolute paths like 'http://myhost.com/'.
54
+ #
55
+ # Note: a compound path like 'dir/file' is invalid if the parent node already has a child
56
+ # with path 'dir/'!!! (solution: just create a node with path 'file' and node 'dir/' as parent!)
57
+ def initialize( parent, path )
58
+ @parent = nil
59
+ @path = path
60
+ self.parent = parent
61
+ @node_info = Hash.new
62
+ @meta_info = Hash.new
63
+ end
64
+
65
+ # Returns the root node for +node+.
66
+ def self.root( node )
67
+ node = node.parent until node.parent.nil?
68
+ node
69
+ end
70
+
71
+ # Sets a new parent for the node.
72
+ def parent=( var )
73
+ @parent.del_child( self ) unless @parent.nil?
74
+ @parent = var
75
+ @parent.add_child( self ) unless @parent.nil?
76
+ precalc_with_children!
77
+ end
78
+
79
+ # Sets the path for the node.
80
+ def path=( path )
81
+ @path = path
82
+ precalc!
36
83
  end
37
84
 
38
- # Get object +name+ from +metainfo+.
85
+ # Gets object +name+ from +meta_info+.
39
86
  def []( name )
40
- @metainfo[name]
87
+ @meta_info[name]
41
88
  end
42
89
 
43
- # Assign +value+ to +metainfo+ called +name.
90
+ # Assigns +value+ to +meta_info+ called +name.
44
91
  def []=( name, value )
45
- @metainfo[name] = value
92
+ @meta_info[name] = value
46
93
  end
47
94
 
48
- # Get the recursive value for metainfo +name+. +ignoreVirtual+ specifies if virtual nodes should
49
- # not be appended, but they are traversed nonetheless.
50
- def recursive_value( name, ignoreVirtual = true )
51
- value = ignoreVirtual && @metainfo['virtual'] ? '' : @metainfo[name]
52
- if value.nil?
53
- value = ''
54
- self.logger.warn { "No meta information called '#{name}' for <#{metainfo['src']}>" }
55
- end
56
- @parent.nil? ? value : @parent.recursive_value( name, ignoreVirtual ) + value
57
- end
95
+ # Regexp for matching absolute URLs, ie. URLs with a scheme part (also see RFC1738)
96
+ ABSOLUTE_URL = /^\w[a-zA-Z0-9+.-]*:/
58
97
 
98
+ # Returns the full path for this node. See also Node#absolute_path !
99
+ def full_path
100
+ return @precalc[:full_path] if @precalc
59
101
 
60
- # Returns the relative path from this node to +dest+.
61
- def relpath_to_string( dest )
62
- if dest[0] == ?/
63
- from = recursive_value( 'dest' ).sub( /#{self['dest']}$/, '' ).split( '/' )[1..-1] || []
64
- from.fill( '..' )
65
- from.concat( dest.split( '/' )[1..-1] ).join( '/' )
102
+ if @path =~ ABSOLUTE_URL
103
+ @path
66
104
  else
67
- from = recursive_value( 'dest' ).sub( /#{self['dest']}$/, '' ).split( '/' )[1..-1] || []
68
- from.concat( dest.split( '/' ) ).join( '/' )
105
+ (@parent.nil? ? @path : @parent.full_path + @path)
69
106
  end
70
107
  end
71
108
 
72
- # Return the relative path from this node to the destNode, virtual nodes are not used in the
73
- # calculation. The destNode can be any non virtual node. If +destNode+ starts with http://, the
74
- # relative path to it is the empty string. If +includeDestNode+ is true, then the path of the
75
- # destination node is appended to the calculated path.
76
- def relpath_to_node( destNode, includeDestNode = true)
77
- if URI::parse( destNode['dest'] ).absolute?
78
- path = destNode['dest']
109
+ # Returns the absolute path, ie. starting with a slash for the root directory, for this node.
110
+ #
111
+ # Here is an example that shows the difference between +full_path+ and +absolute_path+:
112
+ #
113
+ # root = Node.new( nil, '../output/' )
114
+ # dir = Node.new( root, 'testdir/' )
115
+ # node = Node.new( dir, 'testfile' )
116
+ # node.full_path # => '../output/testdir/testfile'
117
+ # node.absolute_path # => '/testdir/testfile'
118
+ def absolute_path
119
+ return @precalc[:absolute_path] if @precalc
120
+
121
+ if @path =~ ABSOLUTE_URL
122
+ @path
79
123
  else
80
- from = recursive_value( 'dest' ).sub( /#{self['dest']}$/, '' ).split( '/' )[1..-1] || []
81
- to = destNode.recursive_value( 'dest' ).sub( /#{destNode['dest']}$/, '' ).split( '/' )[1..-1] || []
82
-
83
- while from.size > 0 and to.size > 0 and from[0] == to[0]
84
- from.shift
85
- to.shift
86
- end
87
-
88
- from.fill( '..' )
89
- from.concat( to )
90
- path = ( from.length == 0 ? '.' : from.join( '/' ) )
91
- path += '/' + destNode['dest'] if includeDestNode && !destNode.parent.nil?
124
+ full_path.sub( /^#{Node.root( self ).path}/, '/' )
92
125
  end
93
- path
94
126
  end
95
127
 
128
+ # Returns the level of the node. The level specifies how deep the node is in the hierarchy.
129
+ def level
130
+ (@parent.nil? ? 0 : @parent.level + 1)
131
+ end
96
132
 
97
- # Return the node identified by +destString+ relative to the current node.
98
- def node_for_string( destString, metainfo='dest' )
99
- node = get_node_for_string( destString, metainfo )
100
- if node.nil?
101
- self.logger.warn { "Could not get destination node '#{destString}' for <#{recursive_value( 'src' )}>" }
102
- end
103
- node
133
+ # Checks if the node is a directory.
134
+ def is_directory?
135
+ @path[-1] == ?/
104
136
  end
105
137
 
106
- # Check if there is a node for +destString+.
107
- def node_for_string?( destString, metainfo='dest' )
108
- get_node_for_string( destString, metainfo )
138
+ # Checks if the node is a file.
139
+ def is_file?
140
+ !is_directory? && !is_fragment?
109
141
  end
110
142
 
111
- # Return the level of the node. The level specifies how deep the node is in the hierarchy.
112
- def level( ignoreVirtual = true )
113
- if self.parent.nil?
114
- 1
115
- else
116
- self.parent.level( ignoreVirtual ) \
117
- + ( (@metainfo['virtual'] && ignoreVirtual) || (@metainfo['dest'] !~ /\/$/) ? 0 : 1 )
143
+ # Checks if the node is a fragment.
144
+ def is_fragment?
145
+ @path[0] == ?#
146
+ end
147
+
148
+ # Matches the path of the node against the given path at the beginning. Returns the
149
+ # matched portion or +nil+. Used by #resolve_node.
150
+ def =~( path )
151
+ md = if is_directory?
152
+ /^#{@path.chomp('/')}(\/|$)/ =~ path #' #emacs hack
153
+ elsif is_fragment?
154
+ /^#{@path}$/ =~ path
155
+ else
156
+ /^#{@path}(?=#|$)/ =~ path
157
+ end
158
+ if md then $& end
159
+ end
160
+
161
+ # Returns the value of the meta info +orderInfo+ or +0+ if it is not set.
162
+ def order_info
163
+ self['orderInfo'].to_s.to_i # nil.to_s.to_i => 0
164
+ end
165
+
166
+ # Sorts nodes by using the meta info +orderInfo+ of both involved nodes or, if these values are
167
+ # equal, by the meta info +title+.
168
+ def <=>( other )
169
+ self_oi = self.order_info
170
+ other_oi = other.order_info
171
+ (self_oi == other_oi ? (self['title'] || '') <=> (other['title'] || '') : self_oi <=> other_oi)
172
+ end
173
+
174
+ # Returns the route to the given path. The parameter +path+ can be a String or a Node.
175
+ def route_to( other )
176
+ my_url = self.to_url
177
+ other_url = case other
178
+ when String then my_url + other
179
+ when Node then other.to_url
180
+ else raise ArgumentError
181
+ end
182
+ # resolve any '.' and '..' paths in the target url
183
+ if other_url.path =~ /\/\.\.?\// && other_url.scheme == 'webgen'
184
+ other_url.path = Pathname.new( other_url.path ).cleanpath.to_s
118
185
  end
186
+ route = my_url.route_to( other_url ).to_s
187
+ (route == '' ? ( self.is_fragment? ? self.parent.path : self.path ) : route )
119
188
  end
120
189
 
121
- # Checks if the current node is in the subtree in which the supplied node is. This is done by
122
- # analyzing the paths of the two nodes.
123
- def in_subtree?( node )
124
- node = node.parent if node.metainfo['dest'] !~ /\/$/
125
- node = node.parent while node['virtual']
126
- /^#{node.recursive_value( 'dest' )}/ =~ recursive_value( 'dest' )
190
+ # Checks if the current node is in the subtree which is spanned by the supplied node. The check is
191
+ # performed using only the +parent+ information of the involved nodes, NOT the actual path values!
192
+ def in_subtree_of?( node )
193
+ temp = self
194
+ temp = temp.parent while !temp.nil? && temp != node
195
+ !temp.nil?
127
196
  end
128
197
 
129
- # Returns the parent directory for this node. This function ignores virtual directories.
130
- def parent_dir
131
- node = self.parent
132
- node = node.parent while !node.nil? && node['virtual']
198
+ # Returns the node representing the given +path+. The path can be absolute (i.e. starting with a
199
+ # slash) or relative to the current node. If no node exists for the given path or it would lie
200
+ # outside the node tree, +nil+ is returned.
201
+ def resolve_node( path )
202
+ url = self.to_url + path
203
+
204
+ path = url.path[1..-1].to_s + (url.fragment.nil? ? '' : '#' + url.fragment)
205
+ return nil if path =~ /^\.\./ || url.scheme != 'webgen' # path outside dest dir or not an internal URL (webgen://...)
206
+
207
+ node = Node.root( self )
208
+
209
+ match = nil
210
+ while !node.nil? && !path.empty?
211
+ node = node.find {|c| match = (c =~ path) }
212
+ path.sub!( match, '' ) unless node.nil?
213
+ break if path.empty?
214
+ end
215
+
133
216
  node
134
217
  end
135
218
 
136
- # Returns the root node for +node+.
137
- def self.root( node )
138
- node = node.parent until node.parent.nil?
139
- node
219
+ # Returns the full URL (including dummy scheme and host) for use with URI classes. The returned
220
+ # URL does not include the real path of the root node but a slash instead. So if the full path of
221
+ # the node is 'a/b/c/d/file1' and the root node path is 'a/b/c', the URL path would be '/d/file1'.
222
+ def to_url
223
+ return @precalc[:to_url] if @precalc
224
+
225
+ url = URI::parse( absolute_path )
226
+ url = URI::parse( 'webgen://webgen.localhost/' ) + url unless url.absolute?
227
+ url
140
228
  end
141
229
 
142
230
  # Returns an informative representation of the node.
143
- def to_s
144
- "<##{self.class.name}: src=#{@metainfo['src']}, dest=#{@metainfo['dest']}, title=#{@metainfo['title']}>"
231
+ def inspect
232
+ "<##{self.class.name}: path=#{full_path}>"
145
233
  end
146
234
 
235
+ alias_method :to_s, :full_path
236
+
147
237
  #######
148
238
  private
149
239
  #######
150
240
 
151
- def get_node_for_string( destString, metainfo='dest' )
152
- return self if destString == ''
153
-
154
- if /^\// =~ destString
155
- node = Node.root( self )
156
- destString = destString[1..-1]
157
- else
158
- node = @metainfo['int:directory?'] ? self : self.parent_dir || self
159
- end
241
+ def precalc!
242
+ @precalc = nil
243
+ @precalc = {
244
+ :full_path => full_path,
245
+ :absolute_path => absolute_path,
246
+ :to_url => to_url
247
+ }
248
+ end
160
249
 
161
- startElement = node
162
- elements = destString.split( '/' )
163
- pagelang = (/\.(\w\w\w?)\.page$/ =~ destString ? $1 : Webgen::Plugin['Configuration']['lang'])
164
-
165
- elements.each do |element|
166
- break if node.nil?
167
- case element
168
- when '..' then node = node.parent
169
- else
170
- node = node.find do |child|
171
- /^#{element}\/?$/ =~ child[metainfo] || \
172
- (metainfo == 'dest' && (child['int:pagename'] == element || child['int:local-pagename'] == element) && \
173
- child['lang'] == pagelang)
174
- end
175
- end
176
- end
250
+ def precalc_with_children!
251
+ precalc!
252
+ each {|child| child.precalc_with_children!}
253
+ end
254
+ protected :precalc_with_children!
177
255
 
178
- # try extended search where child['dest'] can have slashes
179
- if node.nil?
180
- node = startElement
181
- elements.each_with_index do |element, index|
182
- break if node.nil?
183
- temp = node.find {|child| /^#{elements[index..-1].join( '/' )}\/?$/ =~ child[metainfo]}
184
- if temp.nil?
185
- case element
186
- when '..' then node = node.parent
187
- else node = node.find {|child| /^#{element}\/?$/ =~ child[metainfo] }
188
- end
189
- else
190
- node = temp
191
- break
192
- end
193
- end
256
+ # Delegates missing methods to a processor. The current node is placed into the argument array as
257
+ # the first argument before the method +name+ is invoked on the processor.
258
+ def method_missing( name, *args, &block )
259
+ if @node_info[:processor]
260
+ @node_info[:processor].send( name, *([self] + args), &block )
261
+ else
262
+ super
194
263
  end
195
-
196
- node
197
264
  end
198
265
 
266
+ =begin
267
+ TODO:
268
+ - stable sort which does not switch items that have the same order_info
269
+ =end
270
+
199
271
  end