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,121 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'ostruct'
4
+ require 'webgen/utils'
5
+ require 'webgen/error'
6
+
7
+ module Webgen
8
+
9
+ # Provides common functionality for extension manager classes.
10
+ #
11
+ # This module is intended for mixing into an extension manager class. An example for an extension
12
+ # manage class is the Webgen::ContentProcessor class which manages all content processors.
13
+ # Extension manager classes provide methods for registering a certain type of extension and
14
+ # invoking methods on them via a common interface.
15
+ #
16
+ # It is assumed that one wants to associate one or more names with an extension object.
17
+ module ExtensionManager
18
+
19
+ # Create a new extension manager.
20
+ def initialize
21
+ @extensions = {}
22
+ end
23
+
24
+ def initialize_copy(orig) #:nodoc:
25
+ super
26
+ @extensions = {}
27
+ orig.instance_eval { @extensions }.each {|k,v| @extensions[k] = v.clone}
28
+ end
29
+
30
+ # Register a new extension.
31
+ #
32
+ # **Note** that this method has to be implemented by classes that include this module. It should
33
+ # register one or more names for an extension object by associating the names with the extension
34
+ # object data (should be an object that responds at least to :object) via the @extensions hash.
35
+ #
36
+ # The simplest way to achieve this is to use the #do_register method.
37
+ def register(klass, options = {}, &block)
38
+ raise NotImplementedError
39
+ end
40
+
41
+ # Automatically perform the necessary steps to register the extension +klass+. This involves
42
+ # normalization of the class name and associating the extension name (derived from the class
43
+ # name if not set via the key :name in the options hash) with the extension.
44
+ #
45
+ # The parameter +klass+ can either be a String or a Class specifying the class that should be
46
+ # registered.
47
+ #
48
+ # The parameter +options+ allows to associate additional information with an extension. The only
49
+ # recognized key is :name (for the extension name). All other keys are ignored and can/should be
50
+ # used by the extension manager class itself.
51
+ #
52
+ # The parameter +allow_block+ specifies whether the extension manager allows blocks as
53
+ # extensions. If this parameter is +true+ and a block is provided, the +klass+ parameter is
54
+ # not used!
55
+ #
56
+ # Returns the (possibly automatically generated) name for the extension.
57
+ def do_register(klass, options = {}, allow_block = true, &block)
58
+ if !allow_block && block_given?
59
+ raise ArgumentError, "The extension manager '#{self.class.name}' does not support blocks on #register"
60
+ end
61
+ klass, klass_name = normalize_class_name(klass, !block_given?)
62
+ name = (options[:name] || Webgen::Utils.snake_case(klass_name)).to_sym
63
+ @extensions[name] = OpenStruct.new(:object => (block_given? ? block : klass))
64
+ name
65
+ end
66
+ private :do_register
67
+
68
+ # Return a complete class name (including the hierarchy part) based on +klass+ and the class
69
+ # name without the hierarchy part.
70
+ #
71
+ # If the parameter +do_autoload+ is +true+ and the +klass+ is defined under this class, it is
72
+ # autoloaded by turning the class name into a path name (See Webgen::Utils.snake_case).
73
+ def normalize_class_name(klass, do_autoload = true)
74
+ klass = (klass.kind_of?(Class) || klass.include?('::') ? klass : "#{self.class.name}::#{klass}")
75
+ klass_name = klass.to_s.split(/::/).last
76
+ if do_autoload && klass.to_s.start_with?(self.class.name) && klass_name =~ /^[A-Z]/
77
+ self.class.autoload(klass_name.to_sym, Webgen::Utils.snake_case(klass.to_s))
78
+ end
79
+ [klass, klass_name]
80
+ end
81
+ private :normalize_class_name
82
+
83
+ # Return the registered object for the extension +name+.
84
+ #
85
+ # This method also works in the case that +name+ is a String referencing a class. The method
86
+ # assumes that @extensions[name] is an array where the registered object is the first element!
87
+ def extension(name)
88
+ raise Webgen::Error.new("No extension called '#{name}' registered for the '#{self.class.name}' extension manager") unless registered?(name)
89
+ name = name.to_sym
90
+ ext = @extensions[name].object
91
+ ext.kind_of?(String) ? @extensions[name].object = resolve_class(ext) : ext
92
+ end
93
+ private :extension
94
+
95
+ # Return the extension data for the extension +name+.
96
+ def ext_data(name)
97
+ @extensions[name.to_sym]
98
+ end
99
+ private :ext_data
100
+
101
+ # If +class_or_name+ is a String, it is taken as the name of a class and is resolved. Else
102
+ # returns +class_or_name+.
103
+ def resolve_class(class_or_name)
104
+ String === class_or_name ? Webgen::Utils.const_for_name(class_or_name) : class_or_name
105
+ end
106
+ private :resolve_class
107
+
108
+ # Return +true+ if an extension with the given name has been registered with this manager
109
+ # class.
110
+ def registered?(name)
111
+ @extensions.has_key?(name.to_sym)
112
+ end
113
+
114
+ # Return the meta data of all extensions registered with this manager class.
115
+ def registered_extensions
116
+ @extensions.dup
117
+ end
118
+
119
+ end
120
+
121
+ end
@@ -0,0 +1,237 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'set'
4
+ require 'webgen/extension_manager'
5
+
6
+ module Webgen
7
+
8
+ # Namespace for all item trackers.
9
+ #
10
+ # == About
11
+ #
12
+ # This extension manager class is used to track various "items". Such items can be added as a
13
+ # dependency to a node and later be checked if they have changed. This allows webgen to
14
+ # conditionally render a node.
15
+ #
16
+ # An item can basically be anything, there only has to be an item tracker extension that knows how
17
+ # to handle it. Each item tracker extension is uniquely identified by its name (e.g.
18
+ # :+node_content+, :+node_meta_info+, ...).
19
+ #
20
+ # == Implementing an item tracker.
21
+ #
22
+ # An item tracker extension class must respond to the following methods:
23
+ #
24
+ # [initialize(website)]
25
+ # Initializes the extension and provides the website object which can be used to resolve the
26
+ # item ID to the referenced item or item data itself.
27
+ #
28
+ # [item_id(*item)]
29
+ # Return the unique ID for the given item. The returned ID has to be unique for this item
30
+ # tracker extension
31
+ #
32
+ # [item_data(*item)]
33
+ # Return the data for the item so that it can be correctly checked later if it has changed.
34
+ #
35
+ # [changed?(item_id, old_data)]
36
+ # Return +true+ if the item identified by its unique ID has changed. The parameter +old_data+
37
+ # contains the last known data of the item.
38
+ #
39
+ # [node_referenced?(item_id, old_data, node_alcn)]
40
+ # Return +true+ if the node identified by +node_alcn+ is referenced in the old data identified
41
+ # by the unique ID.
42
+ #
43
+ # The parameter +item+ for the methods +item_id+ and +item_data+ contains the information needed
44
+ # to identify the item and is depdendent on the specific item tracker extension class. Therefore
45
+ # you need to look at the documentation for an item tracker extension to see what it expects as
46
+ # the item.
47
+ #
48
+ # Since these methods are invoked multiple times for different items, these methods should have no
49
+ # side effects.
50
+ #
51
+ # == Sample item tracker
52
+ #
53
+ # The following sample item tracker tracks changes in configuration values. It needs the
54
+ # configuration option name as item.
55
+ #
56
+ # class ConfigTracker
57
+ #
58
+ # def initialize(website)
59
+ # @website = website
60
+ # end
61
+ #
62
+ # def item_id(config_key)
63
+ # config_key
64
+ # end
65
+ #
66
+ # def item_data(config_key)
67
+ # @website.config[config_key]
68
+ # end
69
+ #
70
+ # def changed?(config_key, old_val)
71
+ # @website.config[config_key] != old_val
72
+ # end
73
+ #
74
+ # def node_referenced?(config_key, config_value, node_alcn)
75
+ # false
76
+ # end
77
+ #
78
+ # end
79
+ #
80
+ # website.ext.item_tracker.register ConfigTracker, name: :config
81
+ #
82
+ class ItemTracker
83
+
84
+ include Webgen::ExtensionManager
85
+
86
+ # Create a new item tracker for the given website.
87
+ def initialize(website)
88
+ super()
89
+ @instances = {}
90
+ @node_dependencies = Hash.new {|h,k| h[k] = Set.new}
91
+ @item_data = {}
92
+ @cached = {:node_dependencies => {}, :item_data => {}}
93
+ @written_nodes = []
94
+ @checked_nodes = Set.new
95
+
96
+ @website = website
97
+
98
+ @item_changed = {}
99
+
100
+ @website.blackboard.add_listener(:website_initialized, self) do
101
+ @cached = @website.cache[:item_tracker_data] || @cached
102
+ end
103
+
104
+ @website.blackboard.add_listener(:after_tree_populated, self) do |node|
105
+ @item_data.keys.each do |uid|
106
+ @item_data[uid] = item_tracker(uid.first).item_data(*uid.last)
107
+ end
108
+ end
109
+
110
+ @website.blackboard.add_listener(:before_all_nodes_written, self) do
111
+ # make all used item data from the previous pass current again if applicable
112
+ @written_nodes.each do |node|
113
+ next unless @website.tree[node.alcn]
114
+ @node_dependencies[node.alcn].each do |uid|
115
+ @item_data[uid] = item_tracker(uid.first).item_data(*uid.last)
116
+ end
117
+ end
118
+ @written_nodes = []
119
+ @item_changed = {}
120
+ end
121
+
122
+ @website.blackboard.add_listener(:after_node_written, self) do |node|
123
+ @written_nodes << node
124
+ end
125
+
126
+ @website.blackboard.add_listener(:after_all_nodes_written, self) do
127
+ # update cached data with data from the run
128
+ @written_nodes.each do |node|
129
+ next unless @website.tree[node.alcn]
130
+ @cached[:node_dependencies][node.alcn] = @node_dependencies[node.alcn]
131
+ @node_dependencies[node.alcn].each {|uid| @cached[:item_data][uid] = @item_data[uid]}
132
+ end
133
+ end
134
+
135
+ @website.blackboard.add_listener(:website_generated, self) do
136
+ @cached[:node_dependencies].reject! {|alcn, data| !@website.tree[alcn]}
137
+ @cached[:item_data].merge!(@item_data)
138
+ @cached[:item_data].reject! do |uid, _|
139
+ !@cached[:node_dependencies].find {|alcn, data| data.include?(uid)}
140
+ end
141
+ @website.cache[:item_tracker_data] = @cached
142
+ end
143
+ end
144
+
145
+ # Register an item tracker.
146
+ #
147
+ # The parameter +klass+ has to contain the name of the item tracker class or the class object
148
+ # itself. If the class is located under this namespace, only the class name without the
149
+ # hierarchy part is needed, otherwise the full class name including parent module/class names is
150
+ # needed.
151
+ #
152
+ # === Options:
153
+ #
154
+ # [:name] The name for the item tracker class. If not set, it defaults to the snake-case version
155
+ # (i.e. FileSystem → file_system) of the class name (without the hierarchy part). It
156
+ # should only contain letters.
157
+ #
158
+ # === Examples:
159
+ #
160
+ # item_tracker.register('Node') # registers Webgen::ItemTracker::Node
161
+ #
162
+ # item_tracker.register('::Node') # registers Node !!!
163
+ #
164
+ # item_tracker.register('MyModule::Doit', name: 'infos')
165
+ #
166
+ def register(klass, options={}, &block)
167
+ do_register(klass, options, false, &block)
168
+ end
169
+
170
+ # Add the given item that is handled by the item tracker extension +name+ as a dependency to the
171
+ # node.
172
+ def add(node, name, *item)
173
+ uid = unique_id(name, item)
174
+ @node_dependencies[node.alcn] << uid
175
+ @item_data[uid] ||= item_tracker(name).item_data(*uid.last)
176
+ end
177
+
178
+ # Return +true+ if the given node has changed.
179
+ def node_changed?(node)
180
+ return false if @checked_nodes.include?(node)
181
+ @checked_nodes << node
182
+ !@cached[:node_dependencies].has_key?(node.alcn) ||
183
+ @cached[:node_dependencies][node.alcn].any? {|uid| item_changed_by_uid?(uid)}
184
+ ensure
185
+ @checked_nodes.delete(node)
186
+ end
187
+
188
+ # Return +true+ if the given node has been referenced by any item tracker extension.
189
+ def node_referenced?(node)
190
+ node_alcn = node.alcn
191
+ checked_uids = Set.new
192
+ @cached[:node_dependencies].each do |alcn, uids|
193
+ next if alcn == node_alcn
194
+ uids.each do |uid|
195
+ next if checked_uids.include?(uid)
196
+ checked_uids << uid
197
+ return true if item_tracker(uid.first).node_referenced?(uid.last, @cached[:item_data][uid], node_alcn)
198
+ end
199
+ end
200
+ false
201
+ end
202
+
203
+ # Return +true+ if the given item that is handled by the item tracker extension +name+ has
204
+ # changed.
205
+ def item_changed?(name, *item)
206
+ item_changed_by_uid?(unique_id(name, item))
207
+ end
208
+
209
+ #######
210
+ private
211
+ #######
212
+
213
+ # Return +true+ if the given item has changed. See #add for a description of the item
214
+ # parameters.
215
+ def item_changed_by_uid?(uid)
216
+ return @item_changed[uid] if @item_changed.has_key?(uid)
217
+ @item_changed[uid] = if !@cached[:item_data].has_key?(uid)
218
+ true
219
+ else
220
+ item_tracker(uid.first).changed?(uid.last, @cached[:item_data][uid])
221
+ end
222
+ end
223
+
224
+ # Return the unique ID for the given item handled by the item tracker extension object specified
225
+ # by name.
226
+ def unique_id(name, item)
227
+ [name.to_sym, item_tracker(name).item_id(*item)]
228
+ end
229
+
230
+ # Return the item tracker extension object called name.
231
+ def item_tracker(name)
232
+ @instances[name] ||= extension(name).new(@website)
233
+ end
234
+
235
+ end
236
+
237
+ end
@@ -0,0 +1,39 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/item_tracker'
4
+
5
+ module Webgen
6
+ class ItemTracker
7
+
8
+ # This class is used to track changes to a file.
9
+ #
10
+ # The item for this tracker is the name of the file, i.e. add an item like this:
11
+ #
12
+ # website.ext.item_tracker.add(some_node, :file, '/home/me/file.jpg')
13
+ #
14
+ class File
15
+
16
+ def initialize(website) #:nodoc:
17
+ @website = website
18
+ end
19
+
20
+ def item_id(filename) #:nodoc:
21
+ filename
22
+ end
23
+
24
+ def item_data(filename) #:nodoc:
25
+ ::File.mtime(filename)
26
+ end
27
+
28
+ def changed?(filename, old_mtime) #:nodoc:
29
+ ::File.mtime(filename) > old_mtime
30
+ end
31
+
32
+ def node_referenced?(filename, mtime, node_alcn) #:nodoc:
33
+ false
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,61 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/item_tracker'
4
+
5
+ module Webgen
6
+ class ItemTracker
7
+
8
+ # This class is used to track unresolved absolute node paths.
9
+ #
10
+ # The item for this tracker is the unresolved absolute node path and, optionally, a language.
11
+ #
12
+ # For example:
13
+ #
14
+ # website.ext.item_tracker.add(some_node, :missing_node, '/dir/missing.html')
15
+ # website.ext.item_tracker.add(some_node, :missing_node, '/dir/missing.html', 'de')
16
+ #
17
+ class MissingNode
18
+
19
+ def initialize(website) #:nodoc:
20
+ @website = website
21
+ @at_least_one_node_created = true
22
+ @stop_reporting = false
23
+
24
+ @website.blackboard.add_listener(:after_node_created, self) do
25
+ @at_least_one_node_created = true
26
+ end
27
+ @website.blackboard.add_listener(:after_all_nodes_written, self) do
28
+ if @at_least_one_node_created
29
+ @at_least_one_node_created = false
30
+ else
31
+ @stop_reporting = true
32
+ end
33
+ end
34
+ @website.blackboard.add_listener(:website_generated, self) do
35
+ @at_least_one_node_created = true
36
+ @stop_reporting = false
37
+ end
38
+ end
39
+
40
+ def item_id(path, lang = nil) #:nodoc:
41
+ [path, lang]
42
+ end
43
+
44
+ def item_data(path, lang) #:nodoc:
45
+ @website.tree.resolve_node(path, lang).nil?
46
+ end
47
+
48
+ def changed?(iid, old_data) #:nodoc:
49
+ return false if @stop_reporting
50
+ missing = item_data(*iid)
51
+ missing || missing != old_data
52
+ end
53
+
54
+ def node_referenced?(iid, missing, node_alcn) #:nodoc:
55
+ iid.first == node_alcn
56
+ end
57
+
58
+ end
59
+
60
+ end
61
+ end