webgen 0.5.17 → 1.0.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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