webgen 0.5.17 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (408) hide show
  1. data/API.rdoc +143 -0
  2. data/AUTHORS +0 -1
  3. data/COPYING +17 -8
  4. data/ChangeLog +4456 -0
  5. data/GPL +623 -289
  6. data/README.md +71 -0
  7. data/Rakefile +87 -99
  8. data/VERSION +1 -1
  9. data/bin/webgen +1 -7
  10. data/data/webgen/basic_website_template/ext/init.rb +15 -0
  11. data/data/webgen/basic_website_template/webgen.config +18 -0
  12. data/data/webgen/bundle_template_files/README.md.erb +24 -0
  13. data/data/webgen/bundle_template_files/Rakefile.erb +36 -0
  14. data/data/webgen/bundle_template_files/info.yaml.erb +16 -0
  15. data/data/webgen/bundle_template_files/init.rb.erb +1 -0
  16. data/data/webgen/passive_sources/default.metainfo +32 -0
  17. data/data/webgen/passive_sources/stylesheets/coderay-default.css +109 -118
  18. data/data/webgen/passive_sources/templates/feed.template +62 -0
  19. data/data/webgen/passive_sources/templates/sitemap.template +3 -6
  20. data/data/webgen/passive_sources/templates/tag.template +42 -0
  21. data/data/webgen/website_bundles/default/README +2 -2
  22. data/lib/webgen/blackboard.rb +15 -51
  23. data/lib/webgen/bundle/built-in-show-changes/init.rb +54 -0
  24. data/lib/webgen/bundle/built-in/init.rb +366 -0
  25. data/lib/webgen/bundle_loader.rb +126 -0
  26. data/lib/webgen/cache.rb +9 -18
  27. data/lib/webgen/cli.rb +131 -58
  28. data/lib/webgen/cli/bundle_command.rb +30 -0
  29. data/lib/webgen/cli/create_bundle_command.rb +46 -0
  30. data/lib/webgen/cli/create_command.rb +48 -60
  31. data/lib/webgen/cli/generate_command.rb +25 -0
  32. data/lib/webgen/cli/install_bundle_command.rb +34 -0
  33. data/lib/webgen/cli/list_bundle_command.rb +108 -0
  34. data/lib/webgen/cli/logger.rb +45 -0
  35. data/lib/webgen/cli/show_command.rb +30 -0
  36. data/lib/webgen/cli/show_config_command.rb +63 -0
  37. data/lib/webgen/cli/show_dependencies_command.rb +103 -0
  38. data/lib/webgen/cli/show_extensions_command.rb +74 -0
  39. data/lib/webgen/cli/utils.rb +68 -95
  40. data/lib/webgen/configuration.rb +143 -105
  41. data/lib/webgen/content_processor.rb +160 -0
  42. data/lib/webgen/content_processor/blocks.rb +96 -0
  43. data/lib/webgen/content_processor/builder.rb +25 -0
  44. data/lib/webgen/content_processor/erb.rb +25 -0
  45. data/lib/webgen/content_processor/erubis.rb +31 -0
  46. data/lib/webgen/content_processor/fragments.rb +82 -0
  47. data/lib/webgen/content_processor/haml.rb +25 -0
  48. data/lib/webgen/content_processor/html_head.rb +157 -0
  49. data/lib/webgen/content_processor/kramdown.rb +49 -0
  50. data/lib/webgen/content_processor/maruku.rb +39 -0
  51. data/lib/webgen/content_processor/r_discount.rb +21 -0
  52. data/lib/webgen/content_processor/rdoc.rb +22 -0
  53. data/lib/webgen/content_processor/redcloth.rb +23 -0
  54. data/lib/webgen/content_processor/ruby.rb +20 -0
  55. data/lib/webgen/content_processor/sass.rb +145 -0
  56. data/lib/webgen/content_processor/scss.rb +23 -0
  57. data/lib/webgen/content_processor/tags.rb +30 -0
  58. data/lib/webgen/content_processor/tidy.rb +32 -0
  59. data/lib/webgen/content_processor/tikz.rb +116 -0
  60. data/lib/webgen/content_processor/xmllint.rb +31 -0
  61. data/lib/webgen/context.rb +57 -29
  62. data/lib/webgen/context/html_head.rb +60 -0
  63. data/lib/webgen/context/nodes.rb +32 -27
  64. data/lib/webgen/context/rendering.rb +39 -0
  65. data/lib/webgen/context/webgen_tags.rb +25 -0
  66. data/lib/webgen/core_ext.rb +25 -0
  67. data/lib/webgen/destination.rb +151 -0
  68. data/lib/webgen/destination/file_system.rb +62 -0
  69. data/lib/webgen/error.rb +59 -49
  70. data/lib/webgen/extension_manager.rb +121 -0
  71. data/lib/webgen/item_tracker.rb +237 -0
  72. data/lib/webgen/item_tracker/file.rb +39 -0
  73. data/lib/webgen/item_tracker/missing_node.rb +61 -0
  74. data/lib/webgen/item_tracker/node_content.rb +40 -0
  75. data/lib/webgen/item_tracker/node_meta_info.rb +53 -0
  76. data/lib/webgen/item_tracker/nodes.rb +92 -0
  77. data/lib/webgen/logger.rb +26 -82
  78. data/lib/webgen/node.rb +122 -367
  79. data/lib/webgen/node_finder.rb +336 -0
  80. data/lib/webgen/page.rb +48 -85
  81. data/lib/webgen/path.rb +218 -156
  82. data/lib/webgen/path_handler.rb +400 -0
  83. data/lib/webgen/path_handler/base.rb +220 -0
  84. data/lib/webgen/path_handler/copy.rb +78 -0
  85. data/lib/webgen/path_handler/directory.rb +21 -0
  86. data/lib/webgen/path_handler/feed.rb +82 -0
  87. data/lib/webgen/path_handler/meta_info.rb +84 -0
  88. data/lib/webgen/path_handler/page.rb +38 -0
  89. data/lib/webgen/path_handler/page_utils.rb +79 -0
  90. data/lib/webgen/path_handler/sitemap.rb +52 -0
  91. data/lib/webgen/path_handler/template.rb +96 -0
  92. data/lib/webgen/path_handler/virtual.rb +85 -0
  93. data/lib/webgen/{webgentask.rb → rake_task.rb} +31 -27
  94. data/lib/webgen/source.rb +106 -24
  95. data/lib/webgen/source/file_system.rb +41 -0
  96. data/lib/webgen/source/stacked.rb +49 -53
  97. data/lib/webgen/source/tar_archive.rb +59 -0
  98. data/lib/webgen/tag.rb +250 -19
  99. data/lib/webgen/tag/breadcrumb_trail.rb +65 -0
  100. data/lib/webgen/tag/coderay.rb +32 -35
  101. data/lib/webgen/tag/date.rb +9 -9
  102. data/lib/webgen/tag/execute_command.rb +31 -0
  103. data/lib/webgen/tag/include_file.rb +32 -0
  104. data/lib/webgen/tag/langbar.rb +31 -47
  105. data/lib/webgen/tag/link.rb +17 -18
  106. data/lib/webgen/tag/menu.rb +27 -189
  107. data/lib/webgen/tag/meta_info.rb +31 -0
  108. data/lib/webgen/tag/relocatable.rb +48 -39
  109. data/lib/webgen/tag/tikz.rb +24 -100
  110. data/lib/webgen/task.rb +99 -0
  111. data/lib/webgen/task/create_bundle.rb +73 -0
  112. data/lib/webgen/task/create_website.rb +94 -0
  113. data/lib/webgen/task/generate_website.rb +47 -0
  114. data/lib/webgen/test_helper.rb +183 -0
  115. data/lib/webgen/tree.rb +95 -46
  116. data/lib/webgen/utils.rb +39 -0
  117. data/lib/webgen/utils/external_command.rb +27 -0
  118. data/lib/webgen/utils/tag_parser.rb +124 -0
  119. data/lib/webgen/version.rb +1 -1
  120. data/lib/webgen/website.rb +134 -296
  121. data/setup.rb +1 -1
  122. data/test/test_documentation.rb +43 -0
  123. data/test/webgen/cli/test_logger.rb +41 -0
  124. data/test/{test_contentprocessor_blocks.rb → webgen/content_processor/test_blocks.rb} +30 -28
  125. data/test/webgen/content_processor/test_builder.rb +25 -0
  126. data/test/webgen/content_processor/test_erb.rb +21 -0
  127. data/test/webgen/content_processor/test_erubis.rb +33 -0
  128. data/test/webgen/content_processor/test_fragments.rb +96 -0
  129. data/test/webgen/content_processor/test_haml.rb +24 -0
  130. data/test/webgen/content_processor/test_html_head.rb +78 -0
  131. data/test/webgen/content_processor/test_kramdown.rb +49 -0
  132. data/test/webgen/content_processor/test_maruku.rb +30 -0
  133. data/test/webgen/content_processor/test_r_discount.rb +18 -0
  134. data/test/webgen/content_processor/test_rdoc.rb +18 -0
  135. data/test/webgen/content_processor/test_redcloth.rb +23 -0
  136. data/test/webgen/content_processor/test_ruby.rb +24 -0
  137. data/test/webgen/content_processor/test_sass.rb +44 -0
  138. data/test/webgen/content_processor/test_scss.rb +23 -0
  139. data/test/webgen/content_processor/test_tags.rb +44 -0
  140. data/test/webgen/content_processor/test_tidy.rb +31 -0
  141. data/test/webgen/content_processor/test_tikz.rb +33 -0
  142. data/test/webgen/content_processor/test_xmllint.rb +32 -0
  143. data/test/webgen/destination/test_file_system.rb +54 -0
  144. data/test/webgen/item_tracker/test_file.rb +31 -0
  145. data/test/webgen/item_tracker/test_missing_node.rb +70 -0
  146. data/test/webgen/item_tracker/test_node_content.rb +42 -0
  147. data/test/webgen/item_tracker/test_node_meta_info.rb +44 -0
  148. data/test/webgen/item_tracker/test_nodes.rb +61 -0
  149. data/test/webgen/path_handler/test_base.rb +153 -0
  150. data/test/webgen/path_handler/test_copy.rb +56 -0
  151. data/test/webgen/path_handler/test_feed.rb +85 -0
  152. data/test/webgen/path_handler/test_meta_info.rb +98 -0
  153. data/test/webgen/path_handler/test_page.rb +25 -0
  154. data/test/webgen/path_handler/test_page_utils.rb +59 -0
  155. data/test/webgen/path_handler/test_sitemap.rb +95 -0
  156. data/test/webgen/path_handler/test_template.rb +64 -0
  157. data/test/webgen/path_handler/test_virtual.rb +87 -0
  158. data/test/webgen/source/test_file_system.rb +51 -0
  159. data/test/webgen/source/test_stacked.rb +35 -0
  160. data/test/{test_source_tararchive.rb → webgen/source/test_tar_archive.rb} +10 -25
  161. data/test/webgen/tag/test_breadcrumb_trail.rb +66 -0
  162. data/test/webgen/tag/test_coderay.rb +34 -0
  163. data/test/webgen/tag/test_date.rb +18 -0
  164. data/test/webgen/tag/test_execute_command.rb +36 -0
  165. data/test/webgen/tag/test_include_file.rb +35 -0
  166. data/test/webgen/tag/test_langbar.rb +50 -0
  167. data/test/webgen/tag/test_link.rb +40 -0
  168. data/test/webgen/tag/test_menu.rb +61 -0
  169. data/test/webgen/tag/test_meta_info.rb +25 -0
  170. data/test/webgen/tag/test_relocatable.rb +50 -0
  171. data/test/webgen/tag/test_tikz.rb +41 -0
  172. data/test/webgen/task/test_create_website.rb +46 -0
  173. data/test/webgen/test_blackboard.rb +31 -0
  174. data/test/webgen/test_bundle_loader.rb +55 -0
  175. data/test/{test_cache.rb → webgen/test_cache.rb} +3 -15
  176. data/test/webgen/test_cli.rb +41 -0
  177. data/test/webgen/test_configuration.rb +131 -0
  178. data/test/webgen/test_content_processor.rb +86 -0
  179. data/test/webgen/test_context.rb +73 -0
  180. data/test/webgen/test_core_ext.rb +20 -0
  181. data/test/webgen/test_destination.rb +48 -0
  182. data/test/webgen/test_error.rb +121 -0
  183. data/test/webgen/test_extension_manager.rb +70 -0
  184. data/test/webgen/test_item_tracker.rb +106 -0
  185. data/test/{test_languages.rb → webgen/test_languages.rb} +4 -4
  186. data/test/webgen/test_logger.rb +46 -0
  187. data/test/webgen/test_node.rb +178 -0
  188. data/test/webgen/test_node_finder.rb +127 -0
  189. data/test/{test_page.rb → webgen/test_page.rb} +44 -48
  190. data/test/webgen/test_path.rb +271 -0
  191. data/test/{test_webgentask.rb → webgen/test_rake_task.rb} +4 -4
  192. data/test/webgen/test_source.rb +59 -0
  193. data/test/webgen/test_tag.rb +137 -0
  194. data/test/webgen/test_task.rb +40 -0
  195. data/test/webgen/test_tree.rb +147 -0
  196. data/test/webgen/test_utils.rb +16 -0
  197. data/test/webgen/test_website.rb +45 -0
  198. data/test/webgen/utils/test_tag_parser.rb +99 -0
  199. metadata +292 -344
  200. data/data/webgen/passive_sources/templates/atom_feed.template +0 -39
  201. data/data/webgen/passive_sources/templates/rss_feed.template +0 -28
  202. data/data/webgen/resources.yaml +0 -4
  203. data/data/webgen/webgui/app.rb +0 -11
  204. data/data/webgen/webgui/controller/main.rb +0 -135
  205. data/data/webgen/webgui/layout/default.xhtml +0 -40
  206. data/data/webgen/webgui/overrides/win32console.rb +0 -0
  207. data/data/webgen/webgui/public/css/jquery.autocomplete.css +0 -50
  208. data/data/webgen/webgui/public/css/ramaze_error.css +0 -90
  209. data/data/webgen/webgui/public/css/style.css +0 -55
  210. data/data/webgen/webgui/public/img/headerbg.jpg +0 -0
  211. data/data/webgen/webgui/public/img/webgen_logo.png +0 -0
  212. data/data/webgen/webgui/public/js/jquery.autocomplete.js +0 -15
  213. data/data/webgen/webgui/public/js/jquery.js +0 -32
  214. data/data/webgen/webgui/start.rb +0 -9
  215. data/data/webgen/webgui/view/create_website.xhtml +0 -14
  216. data/data/webgen/webgui/view/error.xhtml +0 -64
  217. data/data/webgen/webgui/view/index.xhtml +0 -22
  218. data/data/webgen/webgui/view/manage_website.xhtml +0 -18
  219. data/data/webgen/website_skeleton/README +0 -10
  220. data/data/webgen/website_skeleton/Rakefile +0 -69
  221. data/data/webgen/website_skeleton/config.yaml +0 -35
  222. data/data/webgen/website_skeleton/ext/init.rb +0 -10
  223. data/doc/contentprocessor.template +0 -11
  224. data/doc/contentprocessor/blocks.page +0 -129
  225. data/doc/contentprocessor/builder.page +0 -79
  226. data/doc/contentprocessor/erb.page +0 -60
  227. data/doc/contentprocessor/erubis.page +0 -46
  228. data/doc/contentprocessor/fragments.page +0 -26
  229. data/doc/contentprocessor/haml.page +0 -46
  230. data/doc/contentprocessor/head.page +0 -31
  231. data/doc/contentprocessor/kramdown.page +0 -49
  232. data/doc/contentprocessor/less.page +0 -34
  233. data/doc/contentprocessor/maruku.page +0 -44
  234. data/doc/contentprocessor/rdiscount.page +0 -37
  235. data/doc/contentprocessor/rdoc.page +0 -36
  236. data/doc/contentprocessor/redcloth.page +0 -41
  237. data/doc/contentprocessor/sass.page +0 -31
  238. data/doc/contentprocessor/scss.page +0 -39
  239. data/doc/contentprocessor/tags.page +0 -73
  240. data/doc/contentprocessor/tidy.page +0 -14
  241. data/doc/contentprocessor/xmllint.page +0 -14
  242. data/doc/extensions.metainfo +0 -29
  243. data/doc/extensions.page +0 -15
  244. data/doc/extensions.template +0 -17
  245. data/doc/faq.page +0 -222
  246. data/doc/getting_started.page +0 -135
  247. data/doc/index.page +0 -71
  248. data/doc/manual.page +0 -727
  249. data/doc/reference_configuration.page +0 -1254
  250. data/doc/reference_metainfo.page +0 -265
  251. data/doc/reference_website_styles.page +0 -32
  252. data/doc/source/filesystem.page +0 -41
  253. data/doc/source/tararchive.page +0 -40
  254. data/doc/sourcehandler.template +0 -23
  255. data/doc/sourcehandler/copy.page +0 -19
  256. data/doc/sourcehandler/directory.page +0 -27
  257. data/doc/sourcehandler/feed.page +0 -102
  258. data/doc/sourcehandler/metainfo.page +0 -48
  259. data/doc/sourcehandler/page.page +0 -14
  260. data/doc/sourcehandler/sitemap.page +0 -46
  261. data/doc/sourcehandler/template.page +0 -45
  262. data/doc/sourcehandler/virtual.page +0 -49
  263. data/doc/tag.template +0 -25
  264. data/doc/tag/breadcrumbtrail.page +0 -40
  265. data/doc/tag/coderay.page +0 -53
  266. data/doc/tag/date.page +0 -31
  267. data/doc/tag/executecommand.page +0 -26
  268. data/doc/tag/includefile.page +0 -32
  269. data/doc/tag/langbar.page +0 -47
  270. data/doc/tag/link.page +0 -44
  271. data/doc/tag/menu.page +0 -109
  272. data/doc/tag/metainfo.page +0 -29
  273. data/doc/tag/relocatable.page +0 -38
  274. data/doc/tag/sitemap.page +0 -31
  275. data/doc/tag/tikz.page +0 -159
  276. data/doc/upgrading.page +0 -138
  277. data/doc/webgen_page_format.page +0 -129
  278. data/doc/website_styles.metainfo +0 -8
  279. data/lib/webgen/cli/apply_command.rb +0 -66
  280. data/lib/webgen/cli/run_command.rb +0 -22
  281. data/lib/webgen/cli/webgui_command.rb +0 -68
  282. data/lib/webgen/common.rb +0 -27
  283. data/lib/webgen/common/sitemap.rb +0 -83
  284. data/lib/webgen/contentprocessor.rb +0 -117
  285. data/lib/webgen/contentprocessor/blocks.rb +0 -92
  286. data/lib/webgen/contentprocessor/builder.rb +0 -29
  287. data/lib/webgen/contentprocessor/erb.rb +0 -26
  288. data/lib/webgen/contentprocessor/erubis.rb +0 -39
  289. data/lib/webgen/contentprocessor/fragments.rb +0 -25
  290. data/lib/webgen/contentprocessor/haml.rb +0 -34
  291. data/lib/webgen/contentprocessor/head.rb +0 -128
  292. data/lib/webgen/contentprocessor/kramdown.rb +0 -27
  293. data/lib/webgen/contentprocessor/kramdown/html.rb +0 -36
  294. data/lib/webgen/contentprocessor/less.rb +0 -35
  295. data/lib/webgen/contentprocessor/maruku.rb +0 -36
  296. data/lib/webgen/contentprocessor/rdiscount.rb +0 -19
  297. data/lib/webgen/contentprocessor/rdoc.rb +0 -20
  298. data/lib/webgen/contentprocessor/redcloth.rb +0 -21
  299. data/lib/webgen/contentprocessor/sass.rb +0 -22
  300. data/lib/webgen/contentprocessor/scss.rb +0 -22
  301. data/lib/webgen/contentprocessor/tags.rb +0 -170
  302. data/lib/webgen/contentprocessor/tidy.rb +0 -38
  303. data/lib/webgen/contentprocessor/xmllint.rb +0 -37
  304. data/lib/webgen/context/render.rb +0 -32
  305. data/lib/webgen/context/tags.rb +0 -20
  306. data/lib/webgen/coreext.rb +0 -13
  307. data/lib/webgen/default_config.rb +0 -240
  308. data/lib/webgen/loggable.rb +0 -25
  309. data/lib/webgen/output.rb +0 -86
  310. data/lib/webgen/output/filesystem.rb +0 -69
  311. data/lib/webgen/source/filesystem.rb +0 -61
  312. data/lib/webgen/source/resource.rb +0 -45
  313. data/lib/webgen/source/tararchive.rb +0 -78
  314. data/lib/webgen/sourcehandler.rb +0 -275
  315. data/lib/webgen/sourcehandler/base.rb +0 -281
  316. data/lib/webgen/sourcehandler/copy.rb +0 -44
  317. data/lib/webgen/sourcehandler/directory.rb +0 -30
  318. data/lib/webgen/sourcehandler/feed.rb +0 -92
  319. data/lib/webgen/sourcehandler/fragment.rb +0 -70
  320. data/lib/webgen/sourcehandler/memory.rb +0 -42
  321. data/lib/webgen/sourcehandler/metainfo.rb +0 -128
  322. data/lib/webgen/sourcehandler/page.rb +0 -64
  323. data/lib/webgen/sourcehandler/sitemap.rb +0 -60
  324. data/lib/webgen/sourcehandler/template.rb +0 -66
  325. data/lib/webgen/sourcehandler/virtual.rb +0 -117
  326. data/lib/webgen/tag/base.rb +0 -170
  327. data/lib/webgen/tag/breadcrumbtrail.rb +0 -70
  328. data/lib/webgen/tag/executecommand.rb +0 -31
  329. data/lib/webgen/tag/includefile.rb +0 -42
  330. data/lib/webgen/tag/metainfo.rb +0 -27
  331. data/lib/webgen/tag/sitemap.rb +0 -41
  332. data/lib/webgen/websiteaccess.rb +0 -31
  333. data/lib/webgen/websitemanager.rb +0 -125
  334. data/misc/default.css +0 -403
  335. data/misc/default.template +0 -76
  336. data/misc/htmldoc.metainfo +0 -26
  337. data/misc/htmldoc.virtual +0 -17
  338. data/misc/images/arrow.gif +0 -0
  339. data/misc/images/error.png +0 -0
  340. data/misc/images/headerbg.jpg +0 -0
  341. data/misc/images/important.png +0 -0
  342. data/misc/images/information.png +0 -0
  343. data/misc/images/quote.gif +0 -0
  344. data/misc/images/warning.png +0 -0
  345. data/misc/logo.svg +0 -313
  346. data/misc/style.page +0 -33
  347. data/test/helper.rb +0 -61
  348. data/test/test_blackboard.rb +0 -60
  349. data/test/test_cli.rb +0 -119
  350. data/test/test_common_sitemap.rb +0 -58
  351. data/test/test_configuration.rb +0 -68
  352. data/test/test_contentprocessor.rb +0 -39
  353. data/test/test_contentprocessor_builder.rb +0 -41
  354. data/test/test_contentprocessor_erb.rb +0 -33
  355. data/test/test_contentprocessor_erubis.rb +0 -62
  356. data/test/test_contentprocessor_fragments.rb +0 -43
  357. data/test/test_contentprocessor_haml.rb +0 -39
  358. data/test/test_contentprocessor_head.rb +0 -96
  359. data/test/test_contentprocessor_kramdown.rb +0 -56
  360. data/test/test_contentprocessor_less.rb +0 -40
  361. data/test/test_contentprocessor_maruku.rb +0 -33
  362. data/test/test_contentprocessor_rdiscount.rb +0 -21
  363. data/test/test_contentprocessor_rdoc.rb +0 -22
  364. data/test/test_contentprocessor_redcloth.rb +0 -26
  365. data/test/test_contentprocessor_sass.rb +0 -28
  366. data/test/test_contentprocessor_scss.rb +0 -28
  367. data/test/test_contentprocessor_tags.rb +0 -122
  368. data/test/test_contentprocessor_tidy.rb +0 -34
  369. data/test/test_contentprocessor_xmllint.rb +0 -38
  370. data/test/test_context.rb +0 -81
  371. data/test/test_error.rb +0 -93
  372. data/test/test_loggable.rb +0 -32
  373. data/test/test_logger.rb +0 -94
  374. data/test/test_node.rb +0 -469
  375. data/test/test_output_filesystem.rb +0 -60
  376. data/test/test_path.rb +0 -241
  377. data/test/test_source_filesystem.rb +0 -76
  378. data/test/test_source_resource.rb +0 -28
  379. data/test/test_source_stacked.rb +0 -49
  380. data/test/test_sourcehandler_base.rb +0 -136
  381. data/test/test_sourcehandler_copy.rb +0 -47
  382. data/test/test_sourcehandler_directory.rb +0 -38
  383. data/test/test_sourcehandler_feed.rb +0 -88
  384. data/test/test_sourcehandler_fragment.rb +0 -70
  385. data/test/test_sourcehandler_main.rb +0 -39
  386. data/test/test_sourcehandler_memory.rb +0 -44
  387. data/test/test_sourcehandler_metainfo.rb +0 -127
  388. data/test/test_sourcehandler_page.rb +0 -73
  389. data/test/test_sourcehandler_sitemap.rb +0 -68
  390. data/test/test_sourcehandler_template.rb +0 -68
  391. data/test/test_sourcehandler_virtual.rb +0 -106
  392. data/test/test_tag_base.rb +0 -62
  393. data/test/test_tag_breadcrumbtrail.rb +0 -91
  394. data/test/test_tag_coderay.rb +0 -45
  395. data/test/test_tag_date.rb +0 -18
  396. data/test/test_tag_executecommand.rb +0 -41
  397. data/test/test_tag_includefile.rb +0 -50
  398. data/test/test_tag_langbar.rb +0 -71
  399. data/test/test_tag_link.rb +0 -70
  400. data/test/test_tag_menu.rb +0 -207
  401. data/test/test_tag_metainfo.rb +0 -26
  402. data/test/test_tag_relocatable.rb +0 -60
  403. data/test/test_tag_sitemap.rb +0 -47
  404. data/test/test_tag_tikz.rb +0 -69
  405. data/test/test_tree.rb +0 -70
  406. data/test/test_website.rb +0 -130
  407. data/test/test_websiteaccess.rb +0 -25
  408. data/test/test_websitemanager.rb +0 -65
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/error'
4
+ require 'systemu'
5
+
6
+ module Webgen
7
+ module Utils
8
+
9
+ # This module provides methods for easily working with external commands.
10
+ module ExternalCommand
11
+
12
+ # Raise an error if the given command is not available.
13
+ #
14
+ # This just checks if the exit status is zero.
15
+ def self.ensure_available!(cmd, *args)
16
+ status = systemu([cmd, *args], 'stdout' => '')
17
+ raise Webgen::CommandNotFoundError.new(cmd) if status.exitstatus != 0
18
+ end
19
+
20
+ end
21
+
22
+ end
23
+ end
24
+
25
+
26
+
27
+
@@ -0,0 +1,124 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'yaml'
4
+ require 'strscan'
5
+ require 'webgen/error'
6
+
7
+ module Webgen
8
+ module Utils
9
+
10
+ # This class is used to parse a string for webgen tags and replace them with dynamically
11
+ # generated content. See #replace_tags for more information.
12
+ class TagParser
13
+
14
+ # Raised by the Webgen::Utils::TagParser class.
15
+ class Error < Webgen::Error
16
+
17
+ attr_accessor :line
18
+ attr_accessor :column
19
+
20
+ end
21
+
22
+
23
+ # Create a new TagParser object, optionally providing a tag prefix.
24
+ def initialize(prefix = nil)
25
+ @start_re = /(\\*)\{#{prefix}(\w+)(::?)/
26
+ @end_re = /(\\*)\{#{prefix}(\w+)\}/
27
+ end
28
+
29
+ BRACKETS_RE = /([{}])/ # :nodoc:
30
+ ProcessingStruct = Struct.new(:state, :tag, :simple_tag, :backslashes, :brackets, :start_pos, :end_pos,
31
+ :params_start_pos, :params_end_pos, :body_end_pos) # :nodoc:
32
+
33
+ # Return the +content+ with all webgen tags replaced.
34
+ #
35
+ # When a webgen tag is encountered by the parser, the method yields all found information and
36
+ # substitutes the returned string for the tag.
37
+ def replace_tags(content) #:yields: tag_name, params, body
38
+ scanner = StringScanner.new(content)
39
+ data = ProcessingStruct.new(:before_tag)
40
+ while true
41
+ case data.state
42
+ when :before_tag
43
+ if scanner.skip_until(@start_re)
44
+ data.state = :in_start_tag
45
+ data.backslashes = scanner[1].length
46
+ data.brackets = 1
47
+ data.tag = scanner[2]
48
+ data.simple_tag = (scanner[3] == ':')
49
+ data.params_start_pos = scanner.pos
50
+ data.start_pos = scanner.pos - scanner.matched.length
51
+ else
52
+ data.state = :done
53
+ end
54
+
55
+ when :in_start_tag
56
+ data.brackets += (scanner[1] == '{' ? 1 : -1) while data.brackets != 0 && scanner.skip_until(BRACKETS_RE)
57
+ if data.brackets != 0
58
+ raise Error.new("Unbalanced curly brackets found for tag '#{data.tag}'")
59
+ else
60
+ data.params_end_pos = data.body_end_pos = data.end_pos = scanner.pos - 1
61
+ data.state = (data.simple_tag ? :process : :in_body)
62
+ end
63
+
64
+ when :process
65
+ begin
66
+ enc = scanner.string.encoding
67
+ scanner.string.force_encoding('ASCII-8BIT')
68
+ if data.backslashes % 2 == 0
69
+ params = parse_params(scanner.string[data.params_start_pos...data.params_end_pos].force_encoding(enc),
70
+ data.tag)
71
+ result = yield(data.tag, params,
72
+ scanner.string[(data.params_end_pos+1)...data.body_end_pos].to_s.force_encoding(enc))
73
+ result = result.to_s.force_encoding('ASCII-8BIT')
74
+ scanner.string[data.start_pos..data.end_pos] = "\\" * (data.backslashes / 2) + result
75
+ scanner.pos = data.start_pos + result.length
76
+ else
77
+ scanner.string[data.start_pos, 1 + data.backslashes / 2] = ''
78
+ scanner.pos -= 1 + data.backslashes / 2
79
+ end
80
+ ensure
81
+ scanner.string.force_encoding(enc)
82
+ end
83
+ data.state = :before_tag
84
+
85
+ when :in_body
86
+ while (result = scanner.skip_until(@end_re))
87
+ next unless scanner[2] == data.tag
88
+ if scanner[1].length % 2 == 1
89
+ scanner.string[(scanner.pos - scanner.matched.length), 1 + scanner[1].length / 2] = ''
90
+ scanner.pos -= 1 + scanner[1].length / 2
91
+ else
92
+ break
93
+ end
94
+ end
95
+ if result
96
+ data.state = :process
97
+ data.end_pos = scanner.pos - 1
98
+ data.body_end_pos = scanner.pos - scanner.matched.length + scanner[1].length / 2
99
+ else
100
+ raise Error.new("Invalid body part - no end tag found for '#{data.tag}'")
101
+ end
102
+
103
+ when :done
104
+ break
105
+ end
106
+ end
107
+ scanner.string
108
+ rescue Error => e
109
+ e.line = scanner.string[0...data.start_pos].scan("\n").size + 1
110
+ e.column = data.start_pos - (scanner.string.rindex("\n", data.start_pos) || -1)
111
+ raise
112
+ end
113
+
114
+ # Parse the parameter string and return the result.
115
+ def parse_params(param_string, tag)
116
+ YAML::load("--- #{param_string}")
117
+ rescue ArgumentError, SyntaxError => e
118
+ raise Error.new("Could not parse parameter string '#{param_string}' for tag '#{tag}': #{e.message}")
119
+ end
120
+
121
+ end
122
+
123
+ end
124
+ end
@@ -3,6 +3,6 @@
3
3
  module Webgen
4
4
 
5
5
  # The version of webgen.
6
- VERSION = '0.5.17'
6
+ VERSION = '1.0.0.beta1'
7
7
 
8
8
  end
@@ -1,35 +1,20 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- ##
4
- # Welcome to the API documentation of wegen!
5
- #
6
- # Have a look at the base <a href=Webgen.html>webgen module</a> which provides a good starting point!
7
-
8
-
9
3
  # Standard lib requires
10
- require 'logger'
11
- require 'set'
4
+ require 'stringio'
12
5
  require 'fileutils'
6
+ require 'ostruct'
13
7
 
14
8
  # Requirements for Website
15
- require 'webgen/coreext'
16
- require 'webgen/loggable'
17
- require 'webgen/logger'
9
+ require 'webgen/core_ext'
10
+ require 'webgen/utils'
18
11
  require 'webgen/configuration'
19
- require 'webgen/websiteaccess'
20
12
  require 'webgen/blackboard'
21
13
  require 'webgen/cache'
22
- require 'webgen/tree'
23
14
  require 'webgen/error'
24
-
25
- # Files for autoloading
26
- require 'webgen/common'
27
- require 'webgen/context'
28
- require 'webgen/source'
29
- require 'webgen/output'
30
- require 'webgen/sourcehandler'
31
- require 'webgen/contentprocessor'
32
- require 'webgen/tag'
15
+ require 'webgen/tree'
16
+ require 'webgen/bundle_loader'
17
+ require 'webgen/logger'
33
18
 
34
19
  # Load other needed files
35
20
  require 'webgen/path'
@@ -38,337 +23,190 @@ require 'webgen/page'
38
23
  require 'webgen/version'
39
24
 
40
25
 
41
- # The Webgen namespace houses all classes/modules used by webgen.
42
- #
43
- # = webgen
44
- #
45
- # webgen is a command line application for generating a web site from templates and content
46
- # files. Despite this fact, the implementation also provides adequate support for using webgen as a
47
- # library and *full* *support* for extending it.
48
- #
49
- # == Extending webgen
50
- #
51
- # webgen can be extended very easily. Any file called <tt>init.rb</tt> put into the <tt>ext/</tt>
52
- # directory of the website or into one of its sub-directories is automatically loaded on
53
- # Website#init.
54
- #
55
- # You can extend webgen in several ways. However, no magic or special knowledge is needed since
56
- # webgen relies on the power of Ruby itself. So, for example, an extension is just a normal Ruby
57
- # class. Most extension types provide a Base module for mixing into an extension which provides
58
- # default implementations for needed methods.
59
- #
60
- # Following are links to detailed descriptions on how to develop specific types of extensions:
61
- #
62
- # [Webgen::Source] Information on how to implement a class that provides source paths for
63
- # webgen. For example, one could implement a source class that uses a database as
64
- # backend.
65
- #
66
- # [Webgen::Output] Information on how to implement a class that writes content to an output
67
- # location. The default output class just writes to the file system. One could, for
68
- # example, implement an output class that writes the generated files to multiple
69
- # locations or to a remote server.
70
- #
71
- # [Webgen::ContentProcessor] Information on how to develop an extension that processes the
72
- # content. For example, markup-to-HTML converters are implemented as
73
- # content processors in webgen.
74
- #
75
- # [Webgen::SourceHandler::Base] Information on how to implement a class that handles objects of type
76
- # source Path and creates Node instances. For example,
77
- # Webgen::SourceHandler::Page handles the conversion of <tt>.page</tt>
78
- # files to <tt>.html</tt> files.
79
- #
80
- # [Webgen::Tag::Base] Information on how to implement a webgen tag. webgen tags are used to provide
81
- # an easy way for users to include dynamic content such as automatically
82
- # generated menus.
83
- #
84
- #
85
- # == General information
86
- #
87
- # Here are some detail on the internals of webgen that will help you while developing for webgen:
88
- #
89
- # * webgen uses a not so complex system for determining whether a node needs to be recreated or
90
- # re-rendered. However, for this to work correctly all extensions have to follow some rules:
91
- #
92
- # * It is necessary that all node alcns from which the content is used are put into the
93
- # destination node's <tt>node_info[:used_nodes]</tt> set.
94
- #
95
- # * It is necessary that all other node alcns that are used for a node in any way, even if they
96
- # are only referenced or the route to their output path used, have to be put into the node's
97
- # <tt>node_info[:used_meta_info_nodes]</tt> set.
98
- #
99
- # * Any node that is created during the rendering phase, ie. via a content processor, a tag or in
100
- # the #content method of a source handler needs to be put into the rendered node's
101
- # <tt>node_info[:used_meta_info_nodes]</tt> or <tt>node_info[:used_nodes]</tt> set (see above for
102
- # details)! This is especially necessary when using resolved nodes since resolved nodes can be
103
- # created by passive sources!
104
- #
105
- # * webgen provides various Error classes. However, errors should only be raised if additional runs
106
- # won't correct the problem. For example, if a path cannot be resolved, it is possible that in the
107
- # next run a node will be created and that the path can be resolved then. This is always the case,
108
- # for example, with fragment nodes! In such cases an error message should be written out to the
109
- # log to inform the user that there is a potential problem.
110
- #
111
- # == Blackboard services
112
- #
113
- # The Blackboard class provides an easy communication facility between objects. It implements the
114
- # Observer pattern on the one side and allows the definition of services on the other side. One
115
- # advantage of a service over the direct use of an object instance method is that the caller does
116
- # not need to how to find the object that provides the service. It justs uses the Website#blackboard
117
- # instance. An other advantage is that one can easily exchange the place where the service was
118
- # defined without breaking extensions that rely on it.
119
- #
120
- # Following is a list of all services available in the stock webgen distribution by the name and the
121
- # method that implements it (which is useful for looking up the parameters of service).
122
- #
123
- # <tt>:create_fragment_nodes</tt>:: SourceHandler::Fragment#create_fragment_nodes
124
- # <tt>:templates_for_node</tt>:: SourceHandler::Template#templates_for_node
125
- # <tt>:parse_html_headers</tt>:: SourceHandler::Fragment#parse_html_headers
126
- # <tt>:output_instance</tt>:: Output.instance
127
- # <tt>:content_processor_names</tt>:: ContentProcessor.list
128
- # <tt>:content_processor</tt>:: ContentProcessor.for_name
129
- # <tt>:create_sitemap</tt>:: Common::Sitemap#create_sitemap
130
- # <tt>:create_directories</tt>:: SourceHandler::Directory#create_directories
131
- # <tt>:create_nodes</tt>:: SourceHandler::Main#create_nodes
132
- # <tt>:create_nodes_from_paths</tt>:: SourceHandler::Main#create_nodes_from_paths
133
- # <tt>:source_paths</tt>:: SourceHandler::Main#find_all_source_paths
134
- #
135
- # Following is the list of all messages that can be listened to:
136
- #
137
- # <tt>:node_flagged</tt>::
138
- # See Node#flag
139
- #
140
- # <tt>:node_unflagged</tt>::
141
- # See Node#unflag
142
- #
143
- # <tt>:node_changed?</tt>::
144
- # See Node#changed?
145
- # <tt>:node_meta_info_changed?</tt>::
146
- # See Node#meta_info_changed?
147
- #
148
- # <tt>:before_node_created</tt>::
149
- # Sent by the <tt>:create_nodes</tt> service before a node is created (handled by a source handler)
150
- # with the +parent+ and the +path+ as arguments.
151
- #
152
- # <tt>:after_node_created</tt>::
153
- # Sent by the <tt>:create_nodes</tt> service after a node has been created with the created node
154
- # as argument.
155
- #
156
- # <tt>:before_node_deleted</tt>::
157
- # See Tree#delete_node
158
- #
159
- # == Other places to look at
160
- #
161
- # Here is a list of modules/classes that are primarily used throughout webgen or provide useful
162
- # methods for developing extensions:
163
- #
164
- # Common, Tree, Node, Path, Cache, Page
165
-
166
26
  module Webgen
167
27
 
168
- # Returns the data directory for webgen.
169
- def self.data_dir
170
- unless defined?(@@data_dir)
171
- require 'rbconfig'
172
- @@data_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'webgen'))
173
- @@data_dir = File.expand_path(File.join(Config::CONFIG["datadir"], "webgen")) if !File.exists?(@@data_dir)
174
- raise "Could not find webgen data directory! This is a bug, report it please!" unless File.directory?(@@data_dir)
175
- end
176
- @@data_dir
177
- end
178
-
179
-
180
- # Represents a webgen website and is used to render it.
28
+ #
29
+ # == About
30
+ #
31
+ # Represents a webgen website and provides the main interface for users.
181
32
  #
182
33
  # Normally, webgen is used from the command line via the +webgen+ command or from Rakefiles via
183
- # Webgen::WebgenTask. However, you can also easily use webgen as a library and this class provides
34
+ # Webgen::RakeTask. However, you can also easily use webgen as a library and this class provides
184
35
  # the interface for this usage!
185
36
  #
37
+ # You may notice that this class doesn't have many methods. This is because webgen is designed
38
+ # from ground up to be extensible. Most of the 'magic' happens in extensions which are registered
39
+ # on the #ext OpenStruct object. The simple 'core' classes that are not extensions have separate
40
+ # accessor methods (#config for the Configuration object, #blackboard for the Blackboard and so
41
+ # on).
42
+ #
186
43
  # Since a webgen website is, basically, just a directory, the only parameter needed for creating a
187
- # new Website object is the website directory. After that you can work with the website:
44
+ # new Website object is the website directory. Once created, the website is fully initialized and
45
+ # one can work with it:
188
46
  #
189
- # * If you want to render the website, you just need to call Website#render which initializes the
190
- # website and does all the rendering. When the method call returns, everything has been rendered.
47
+ # * If you want to generate the website, you just need to call #execute_task with
48
+ # :generate_website as parameter.
191
49
  #
192
- # * If you want to remove the generated output, you just need to invoke Website#clean and it will
193
- # be done.
50
+ # * If you want to retrieve data from the website, you can use the various accessors on the
51
+ # Website object itself or use #ext to access all available extensions.
194
52
  #
195
- # * Finally, if you want to retrieve data from the website, you first have to call Website#init to
196
- # initialize the website. After that you can use the various accessors to retrieve the needed
197
- # data. *Note*: This is generally only useful if the website has been rendered because otherwise
198
- # there is no data to retrieve.
53
+ # *Note*: This is generally only useful if the website has been generated before because
54
+ # otherwise there probably is no data to retrieve.
199
55
  #
200
56
  class Website
201
57
 
202
- # Raised when the configuration file of the website is invalid.
203
- class ConfigFileInvalid < RuntimeError; end
204
-
205
- include Loggable
206
-
207
- # The website configuration. Can only be used after #init has been called (which is
208
- # automatically done in #render).
58
+ # The website configuration.
209
59
  attr_reader :config
210
60
 
211
- # The blackboard used for inter-object communication. Can only be used after #init has been
212
- # called.
61
+ # The blackboard used for inter-object communication.
213
62
  attr_reader :blackboard
214
63
 
215
- # A cache to store information that should be available between runs. Can only be used after
216
- # #init has been called.
64
+ # A cache to store information that should be available the next time the website gets
65
+ # generated.
217
66
  attr_reader :cache
218
67
 
68
+ # Access to all extension objects. An OpenStruct object.
69
+ attr_reader :ext
70
+
219
71
  # The internal data structure used to store information about individual nodes.
72
+ #
73
+ # See Tree for more information
220
74
  attr_reader :tree
221
75
 
222
- # The logger used for logging. If set to +nil+, logging is disabled.
223
- attr_accessor :logger
76
+ # The Webgen::Logger used for logging.
77
+ attr_reader :logger
224
78
 
225
79
  # The website directory.
226
80
  attr_reader :directory
227
81
 
228
- # Create a new webgen website for the website in the directory +dir+. If +dir+ is +nil+, the
229
- # environment variable +WEBGEN_WEBSITE+ or, if it is not set either, the current working
230
- # directory is used. You can provide a block (has to take the configuration object as parameter)
231
- # for adjusting the configuration values during the initialization.
232
- def initialize(dir = nil, logger=Webgen::Logger.new($stdout, false), &block)
233
- @blackboard = nil
234
- @cache = nil
235
- @config = nil
236
- @logger = logger
237
- @config_block = block
238
- @directory = (dir.nil? ? (ENV['WEBGEN_WEBSITE'].to_s.empty? ? Dir.pwd : ENV['WEBGEN_WEBSITE']) : dir)
239
- end
240
-
241
- # Define a service +service_name+ provided by the instance of +klass+. The parameter +method+
242
- # needs to define the method which should be invoked when the service is invoked. Can only be
243
- # used after #init has been called.
244
- def autoload_service(service_name, klass, method = service_name)
245
- blackboard.add_service(service_name) {|*args| cache.instance(klass).send(method, *args)}
82
+ # Create a new webgen Website object for the website in the directory +dir+.
83
+ #
84
+ # If no logger is specified, a dummy logger that logs to a StringIO is created.
85
+ #
86
+ # You can provide a block for modifying the Website object in any way during the initialization:
87
+ #
88
+ # * If the block only takes one parameter, it is called with the Website object after the
89
+ # initialization is done but before the cache is restored.
90
+ #
91
+ # * If it takes two parameters, the first one is the Website object and the second one is a
92
+ # boolean specifying whether the block is currently called any initialization (value is
93
+ # +true+) or after it (value is +false).
94
+ #
95
+ def initialize(dir, logger = nil, &block)
96
+ @directory = dir
97
+ @logger = logger || Webgen::Logger.new(StringIO.new)
98
+ @init_block = block
99
+ init
246
100
  end
247
101
 
248
102
  # Initialize the configuration, blackboard and cache objects and load the default configuration
249
- # as well as website specific extension files. An already existing configuration/blackboard is
250
- # deleted!
103
+ # as well as all specified extensions.
251
104
  def init
252
- execute_in_env do
253
- @blackboard = Blackboard.new
254
- @config = Configuration.new
255
-
256
- load 'webgen/default_config.rb'
257
- Dir.glob(File.join(@directory, 'ext', '**/init.rb')) {|f| load(f)}
258
- read_config_file
105
+ @tree = Tree.new(self)
106
+ @blackboard = Blackboard.new
107
+ @config = Configuration.new
108
+ @cache = nil
109
+ @ext = OpenStruct.new
259
110
 
260
- @config_block.call(@config) if @config_block
261
- restore_tree_and_cache
111
+ @init_block.call(self, true) if @init_block && @init_block.arity == 2
112
+ load_bundles
113
+ load_configuration
114
+ if @init_block
115
+ @init_block.arity == 1 ? @init_block.call(self) : @init_block.call(self, false)
262
116
  end
263
- self
264
- end
117
+ @config.freeze
265
118
 
266
- # Render the website (after calling #init if the website is not already initialized) and return
267
- # a status code not equal to +nil+ if rendering was successful.
268
- def render
269
- result = nil
270
- execute_in_env do
271
- init
272
-
273
- puts "Starting webgen..."
274
- shm = SourceHandler::Main.new
275
- result = shm.render
276
- save_tree_and_cache if result
277
- puts "Finished"
278
-
279
- if @logger && @logger.log_output.length > 0
280
- puts "\nLog messages:"
281
- puts @logger.log_output
282
- end
283
- end
284
- result
119
+ restore_cache
120
+ @blackboard.dispatch_msg(:website_initialized)
285
121
  end
122
+ private :init
286
123
 
287
- # Clean the website directory from all generated output files (including the cache file). If
288
- # +del_outdir+ is +true+, then the base output directory is also deleted. When a delete
289
- # operation fails, the error is silently ignored and the clean operation continues.
124
+ # Load all extension bundles.
290
125
  #
291
- # Note: Uses the configured output instance for the operations!
292
- def clean(del_outdir = false)
293
- init
294
- execute_in_env do
295
- output = @blackboard.invoke(:output_instance)
296
- @tree.node_access[:alcn].each do |name, node|
297
- next if node.is_fragment? || node['no_output'] || node.path == '/' || node == @tree.dummy_root
298
- output.delete(node.path) rescue nil
299
- end
126
+ # This loads the extension bundle for the built-in extensions as well as all website specific
127
+ # extension bundles.
128
+ def load_bundles
129
+ ext_dir = File.join(@directory, 'ext')
130
+ ext_loader = BundleLoader.new(self, ext_dir)
131
+ ext_loader.load('built-in')
132
+ ext_loader.load_autoload_bundles
133
+ Dir[File.join(ext_dir, '**/init.rb')].sort.each {|file| ext_loader.load(file[ext_dir.length..-1])}
134
+ ext_loader.load('init.rb') if File.file?(File.join(ext_dir, 'init.rb'))
135
+ end
136
+ private :load_bundles
300
137
 
301
- if @config['website.cache'].first == :file
302
- FileUtils.rm(File.join(@directory, @config['website.cache'].last)) rescue nil
303
- end
138
+ # The name of the configuration file webgen uses.
139
+ CONFIG_FILENAME = 'webgen.config'
140
+
141
+ # Load the configuration file into the Configuration object.
142
+ def load_configuration
143
+ config_file = File.join(@directory, CONFIG_FILENAME)
144
+ return unless File.exist?(config_file)
304
145
 
305
- if del_outdir
306
- output.delete('/') rescue nil
146
+ first_line = File.open(config_file, 'r') {|f| f.gets}
147
+ if first_line =~ /^\s*#.*\bruby\b/
148
+ o = Object.new
149
+ o.instance_variable_set(:@website, self)
150
+ def o.website; @website; end
151
+ begin
152
+ o.instance_eval(File.read(config_file), config_file)
153
+ rescue Exception => e
154
+ raise Webgen::Error.new("Couldn't load webgen configuration file (using Ruby syntax):\n#{e.message}")
155
+ end
156
+ else
157
+ unknown_options = @config.load_from_file(config_file)
158
+ @logger.vinfo { "Configuration data loaded from <#{config_file}>" }
159
+ if unknown_options.length > 0
160
+ @logger.debug { "Ignored following unknown options in configuration file: #{unknown_options.join(', ')}" }
307
161
  end
308
162
  end
309
163
  end
164
+ private :load_configuration
310
165
 
311
- # The provided block is executed within a proper environment sothat any object can access the
312
- # Website object.
313
- def execute_in_env
314
- set_back = Thread.current[:webgen_website]
315
- Thread.current[:webgen_website] = self
316
- yield
317
- ensure
318
- Thread.current[:webgen_website] = set_back
319
- end
320
-
321
- #######
322
- private
323
- #######
324
-
325
- # Restore the tree and the cache from +website.cache+ and returns the Tree object.
326
- def restore_tree_and_cache
166
+ # Restore the cache using the +website.cache+ configuration option.
167
+ def restore_cache
327
168
  @cache = Cache.new
328
- @tree = Tree.new
329
169
  data = if config['website.cache'].first == :file
330
- cache_file = File.join(@directory, config['website.cache'].last)
331
- File.open(cache_file, 'rb') {|f| f.read} if File.exists?(cache_file)
170
+ File.binread(cache_file) if File.file?(cache_file)
332
171
  else
333
172
  config['website.cache'].last
334
173
  end
335
- cache_data, tree, version = Marshal.load(data) rescue nil
336
- if cache_data && version == Webgen::VERSION
337
- @cache.restore(cache_data)
338
- @tree = tree
339
- end
174
+ cache_data, version = Marshal.load(data) rescue nil
175
+ @cache.restore(cache_data) if cache_data && version == Webgen::VERSION
340
176
  end
177
+ private :restore_cache
341
178
 
342
- # Save the +tree+ and the +cache+ to +website.cache+.
343
- def save_tree_and_cache
344
- cache_data = [@cache.dump, @tree, Webgen::VERSION]
179
+ # Save the +cache+.
180
+ def save_cache
181
+ return if config['website.dry_run']
182
+ cache_data = [@cache.dump, Webgen::VERSION]
345
183
  if config['website.cache'].first == :file
346
- cache_file = File.join(@directory, config['website.cache'].last)
347
184
  File.open(cache_file, 'wb') {|f| Marshal.dump(cache_data, f)}
348
185
  else
349
186
  config['website.cache'][1] = Marshal.dump(cache_data)
350
187
  end
351
188
  end
352
189
 
353
- # Update the configuration object for the website with infos found in the configuration file.
354
- def read_config_file
355
- file = File.join(@directory, 'config.yaml')
356
- if File.exists?(file)
357
- begin
358
- config = YAML::load(File.read(file)) || {}
359
- raise 'Structure of config file is not valid, has to be a Hash' if !config.kind_of?(Hash)
360
- config.each do |key, value|
361
- case key
362
- when *Webgen::Configuration::Helpers.public_instance_methods(false).map {|c| c.to_s} then @config.send(key, value)
363
- else @config[key] = value
364
- end
365
- end
366
- rescue RuntimeError, ArgumentError => e
367
- raise ConfigFileInvalid, "Configuration invalid: " + e.message
368
- end
369
- elsif File.exists?(File.join(@directory, 'config.yml'))
370
- log(:warn) { "No configuration file called config.yaml found (there is a config.yml - spelling error?)" }
190
+ # The full path of the cache filename.
191
+ def cache_file
192
+ tmpdir(config['website.cache'].last)
193
+ end
194
+ private :cache_file
195
+
196
+ # Append the path to the website's temporary directory and return the full path to it.
197
+ def tmpdir(path = '')
198
+ unless defined?(@_tmpdir)
199
+ @_tmpdir = File.absolute_path(config['website.tmpdir'], @directory)
200
+ FileUtils.mkdir_p(@_tmpdir)
371
201
  end
202
+ File.join(@_tmpdir, path)
203
+ end
204
+
205
+ # Execute the given task.
206
+ #
207
+ # See Webgen::Task and the classes in its namespace for available classes.
208
+ def execute_task(task, *options)
209
+ @ext.task.execute(task, *options)
372
210
  end
373
211
 
374
212
  end