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,59 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'open-uri'
4
+ require 'zlib'
5
+ require 'set'
6
+
7
+ require 'webgen/source'
8
+ require 'webgen/path'
9
+ webgen_require 'archive/tar/minitar', 'archive-tar-minitar'
10
+
11
+ module Webgen
12
+ class Source
13
+
14
+ # This class is used to read source paths from a (gzipped) tar archive. The archive can be remote
15
+ # (http(s) or ftp) or local.
16
+ #
17
+ # For example, the following are all valid URIs:
18
+ # http://example.com/directory/file.tgz
19
+ # /home/test/my.tar.gz
20
+ # ftp://ftp.example.com/archives/archive.tar
21
+ #
22
+ class TarArchive
23
+
24
+ # The URI of the tar archive.
25
+ attr_reader :uri
26
+
27
+ # The glob (see File.fnmatch for details) that is used to specify which paths in the archive should
28
+ # be returned by #paths.
29
+ attr_reader :glob
30
+
31
+ # Create a new tar archive source for the URI string +uri+.
32
+ def initialize(website, uri, glob = '**/*')
33
+ @uri = uri
34
+ @glob = glob
35
+ end
36
+
37
+ # Return all paths in the tar archive available at #uri.
38
+ def paths
39
+ if !defined?(@paths)
40
+ stream = open(@uri)
41
+ stream = Zlib::GzipReader.new(stream) if @uri =~ /(\.tar\.gz|\.tgz)$/
42
+ Archive::Tar::Minitar::Input.open(stream) do |input|
43
+ @paths = input.collect do |entry|
44
+ path = entry.full_name
45
+ next unless File.fnmatch(@glob, path, File::FNM_DOTMATCH|File::FNM_CASEFOLD|File::FNM_PATHNAME)
46
+ path += '/' if entry.directory? && path[-1] != ?/
47
+ path = '/' + path unless path[0] == ?/
48
+ data = entry.read.to_s
49
+ Path.new(path, 'modified_at' => Time.at(entry.mtime)) {|mode| StringIO.new(data, mode) }
50
+ end.compact.to_set
51
+ end
52
+ end
53
+ @paths
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+ end
data/lib/webgen/tag.rb CHANGED
@@ -1,26 +1,257 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
+ require 'webgen/extension_manager'
4
+ require 'webgen/error'
5
+ require 'webgen/utils/tag_parser'
6
+
3
7
  module Webgen
4
8
 
5
- # Namespace for all classes that are useable by Webgen::ContentProcessor::Tag.
6
- #
7
- # Have a look at the documentation for Webgen::Tag::Base for details on how to implement a tag
8
- # class.
9
- module Tag
10
-
11
- autoload :Base, 'webgen/tag/base'
12
- autoload :Relocatable, 'webgen/tag/relocatable'
13
- autoload :Metainfo, 'webgen/tag/metainfo'
14
- autoload :Menu, 'webgen/tag/menu'
15
- autoload :BreadcrumbTrail, 'webgen/tag/breadcrumbtrail'
16
- autoload :Langbar, 'webgen/tag/langbar'
17
- autoload :IncludeFile, 'webgen/tag/includefile'
18
- autoload :ExecuteCommand, 'webgen/tag/executecommand'
19
- autoload :Coderay, 'webgen/tag/coderay'
20
- autoload :Date, 'webgen/tag/date'
21
- autoload :Sitemap, 'webgen/tag/sitemap'
22
- autoload :TikZ, 'webgen/tag/tikz'
23
- autoload :Link, 'webgen/tag/link'
9
+ # Namespace for all webgen tags.
10
+ #
11
+ # == About
12
+ #
13
+ # A tag object is a webgen extension that handles specific webgen tags. webgen tags are used to
14
+ # add dynamic content to page and template files (or any other file for that matter) and are made
15
+ # for ease of use.
16
+ #
17
+ # == Implementing a tag
18
+ #
19
+ # A tag object only needs to respond to the method +call+ which needs to accept three parameters:
20
+ #
21
+ # [tag]: The name of the tag which should be processed (useful for tag objects which can process
22
+ # different tags).
23
+ #
24
+ # [body]: Holds the body value for the tag if any.
25
+ #
26
+ # [context]: Holds all relevant information for processing -- have a look at the Webgen::Context
27
+ # class to see what is available. The special key :config is set to an
28
+ # Webgen::Configuration object that should be used to retrieve configuration option
29
+ # values because the values might be changed due to options set directly via the tag
30
+ # syntax.
31
+ #
32
+ # The method has to return the result of the processing and, optionally, a boolean value
33
+ # specifying if the result should further be processed (ie. webgen tags replaced).
34
+ #
35
+ # This allows one to implement a tag object as a class with a class method called +call+. Or as a
36
+ # Proc object.
37
+ #
38
+ # The tag object has to be registered so that webgen knows about it, see #register for more
39
+ # information.
40
+ #
41
+ # == Tag options
42
+ #
43
+ # webgen tags allow the specification of options in the tag definition. When registering a tag,
44
+ # one can specify which options are mandatory, i.e. which options always have to be set directly
45
+ # for the tag. The value of the option :config_base for the #register method is used to resolve
46
+ # partially stated configuration entries.
47
+ #
48
+ # == Sample Tag
49
+ #
50
+ # Following is a simple tag class example which just reverses the body text and adds some
51
+ # information about the context to the result.
52
+ #
53
+ # class Reverser
54
+ #
55
+ # def self.call(tag, body, context)
56
+ # result = context[:config]['do_reverse'] ? body.reverse : body
57
+ # result << "Node: " << context.content_node.alcn << " (" << context.content_node['title'] << ")"
58
+ # result << "Reference node: " << context.ref_node.alcn
59
+ # result
60
+ # end
61
+ #
62
+ # end
63
+ #
64
+ # website.config.define_option('reverser.do_reverse', nil, 'Actually do reverse the text')
65
+ # website.ext.tag.register Reverser, :names => 'reverse', :mandatory => ['do_reverse']
66
+ #
67
+ class Tag
68
+
69
+ include Webgen::ExtensionManager
70
+
71
+ # Render the tag template for the given tag and return the result.
72
+ #
73
+ # The value of the configuration option 'tag.<TAG>.template' (where '<TAG>' is replaced with
74
+ # +tag+) is used as template path.
75
+ #
76
+ # If the template node cannot be found, an empty string is returned.
77
+ def self.render_tag_template(context, tag)
78
+ path = context[:config]["tag.#{tag}.template"]
79
+ template_node = context.ref_node.resolve(path, context.dest_node.lang, true)
80
+ if template_node
81
+ context.render_block(:name => "tag.#{tag}", :node => 'first',
82
+ :chain => [*template_node.template_chain, template_node, context.content_node])
83
+ else
84
+ ''
85
+ end
86
+ end
87
+
88
+
89
+ def initialize(website) # :nodoc:
90
+ super()
91
+ website.blackboard.add_listener(:website_initialized, self) do
92
+ @parser = Webgen::Utils::TagParser.new(website.config['tag.prefix'])
93
+ end
94
+ end
95
+
96
+ # Register a tag.
97
+ #
98
+ # The parameter +klass+ can either be a String containing the name of a class/module (which has
99
+ # to respond to :call) or an object that responds to :call. If the class is located under this
100
+ # namespace, only the class name without the hierarchy part is needed, otherwise the full
101
+ # class/module name including parent module/class names is needed.
102
+ #
103
+ # Instead of registering an object that responds to :call, you can also provide a block that
104
+ # processes a tag.
105
+ #
106
+ # === Options:
107
+ #
108
+ # [:names] The tag name or an array of tag names. If not set, it defaults to the lowercase
109
+ # version of the class name (without the hierarchy part).
110
+ #
111
+ # The name :default is used for specifying the default tag which is called if an
112
+ # unknown tag name is encountered.
113
+ #
114
+ # [:config_base] The configuration base, i.e. the part of a configuration option name that does
115
+ # not need to be specified. Defaults to the full class name without the Webgen
116
+ # module downcased and all "::" substituted with "." (e.g. Webgen::Tag::Menu →
117
+ # tag.menu). Needs to be specified when a block is used!
118
+ #
119
+ # [:mandatory] A list of configuration option names whose values always need to be provided. The
120
+ # first configuration option name is used as the default mandatory option (used
121
+ # when only a string is provided in the tag definition).
122
+ #
123
+ # === Examples:
124
+ #
125
+ # tag.register('Date') # registers Webgen::Tag::Date
126
+ #
127
+ # tag.register('::Date') # registers Date !!!
128
+ #
129
+ # tag.register('MyModule::Date', names: ['mydate', 'date'])
130
+ #
131
+ # tag.register('date', config_base: 'tag.date') do |tag, body, context|
132
+ # Time.now.strftime(param('tag.date.format'))
133
+ # end
134
+ #
135
+ def register(klass, options = {}, &block)
136
+ if block_given? && !options[:config_base]
137
+ raise ArgumentError, "The option :config_base needs to be specified when using a block"
138
+ end
139
+
140
+ names = [options.delete(:names)].flatten.compact
141
+ options[:name] = names.shift
142
+ name = do_register(klass, options, true, &block)
143
+ ext_data(name).mandatory = options[:mandatory] || []
144
+ ext_data(name).config_base = options[:config_base] ||
145
+ Webgen::Utils.snake_case(ext_data(name).object.to_s.gsub(/::/, '.').gsub(/^Webgen\./, ''))
146
+ ext_data(name).initialized = false
147
+ names.each {|n| @extensions[n.to_sym] = @extensions[name]}
148
+ end
149
+
150
+ # Process the +tag+ and return the result.
151
+ #
152
+ # The parameter +params+ (can be a Hash, a String or nil) needs to contain the parameters for
153
+ # the tag and +body+ is the optional body for the tag. +context+ needs to be a valid
154
+ # Webgen::Context object.
155
+ def call(tag, params, body, context)
156
+ result = ''
157
+ tdata = tag_data(tag, context)
158
+ if !tdata.nil?
159
+ context[:config] = create_config(tag, params, tdata, context)
160
+ result, process_output = tdata.object.call(tag, body, context)
161
+ result = context.website.ext.content_processor.call('tags', context.clone(:content => result)).content if process_output
162
+ else
163
+ raise Webgen::RenderError.new("No tag processor for '#{tag}' found", self.class.name,
164
+ context.dest_node, context.ref_node)
165
+ end
166
+ result
167
+ rescue Webgen::Error => e
168
+ e.path = context.dest_node if e.path.to_s.empty?
169
+ raise
170
+ rescue Exception => e
171
+ raise Webgen::RenderError.new(e, (tdata && tdata.object.respond_to?(:name) ? tdata.object.name : "tag '#{tag}'"),
172
+ context.dest_node, context.ref_node)
173
+ end
174
+
175
+ # See Webgen::Utils::TagParser#replace_tags.
176
+ def replace_tags(str, &block) #:yields: tag_name, params, body
177
+ @parser.replace_tags(str, &block)
178
+ end
179
+
180
+ #######
181
+ private
182
+ #######
183
+
184
+ # Create the Webgen::Configuration object from the parameters and the given configuration
185
+ # base.
186
+ def create_config(tag, params, tdata, context)
187
+ values = case params
188
+ when Hash then values_from_hash(tag, params, tdata, context)
189
+ when String then values_from_string(tag, params, tdata, context)
190
+ when NilClass then {}
191
+ else
192
+ raise Webgen::RenderError.new("Invalid parameter type (#{params.class})",
193
+ self.class.name, context.dest_node, context.ref_node)
194
+ end
195
+
196
+ if !tdata.mandatory.all? {|k| values.has_key?(k)}
197
+ raise Webgen::RenderError.new("Not all mandatory parameters set", self.class.name, context.dest_node, context.ref_node)
198
+ end
199
+ config = context.website.config.dup
200
+ config.set_values(values)
201
+ config.freeze
202
+ config
203
+ end
204
+
205
+ # Return a hash containing valid configuration options by taking key-value pairs from +params+.
206
+ def values_from_hash(tag, params, tdata, context)
207
+ result = {}
208
+ params.each do |key, value|
209
+ if context.website.config.option?(key)
210
+ result[key] = value
211
+ elsif context.website.config.option?(tdata.config_base + '.' + key)
212
+ result[tdata.config_base + '.' + key] = value
213
+ else
214
+ context.website.logger.warn do
215
+ ["Invalid configuration option '#{key}' for tag '#{tag}' found in <#{context.ref_node}>",
216
+ "Remove the invalid key '#{key}' to fix the warning."]
217
+ end
218
+ end
219
+ end
220
+ result
221
+ end
222
+
223
+ # Return a hash containing valid configuration options by setting the default mandatory
224
+ # parameter for +tag+ to +str+.
225
+ def values_from_string(tag, str, tdata, context)
226
+ if tdata.mandatory.first.nil?
227
+ context.website.logger.error do
228
+ ["No default mandatory option specified for tag '#{tag}' but set in <#{context.ref_node}>",
229
+ "Use the {key: value} syntax for assigning the value '#{str}' to the intended tag option!"]
230
+ end
231
+ {}
232
+ else
233
+ {tdata.mandatory.first => str}
234
+ end
235
+ end
236
+
237
+ # Return the tag data for +tag+ or +nil+ if +tag+ is unknown.
238
+ def tag_data(tag, context)
239
+ tdata = @extensions[tag.to_sym] || @extensions[:default]
240
+ if tdata && !tdata.initialized
241
+ tdata.object = resolve_class(tdata.object)
242
+ tdata.mandatory.each_with_index do |o, index|
243
+ next if context.website.config.option?(o)
244
+ o = tdata.config_base + '.' + o
245
+ if context.website.config.option?(o)
246
+ tdata.mandatory[index] = o
247
+ else
248
+ raise ArgumentError, "Invalid configuration option name '#{o}' specified as mandatory option for tag '#{tag}'"
249
+ end
250
+ end
251
+ tdata.initialized = true
252
+ end
253
+ tdata
254
+ end
24
255
 
25
256
  end
26
257
 
@@ -0,0 +1,65 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/tag'
4
+
5
+ module Webgen
6
+ class Tag
7
+
8
+ # Generates a breadcrumb trail for the page. Such a breadcrumb trail is especially useful when
9
+ # pages are in deep hierarchies of directories.
10
+ module BreadcrumbTrail
11
+
12
+ # Create the breadcrumb trail.
13
+ def self.call(tag, body, context)
14
+ options = {
15
+ :alcn => context.content_node.alcn,
16
+ :start_level => context[:config]['tag.breadcrumb_trail.start_level'],
17
+ :end_level => context[:config]['tag.breadcrumb_trail.end_level'],
18
+ :omit_dir_index => context[:config]['tag.breadcrumb_trail.omit_dir_index']
19
+ }
20
+ context.website.ext.item_tracker.add(context.dest_node, :nodes,
21
+ ['Webgen::Tag::BreadcrumbTrail', 'nodes'], options, :meta_info)
22
+
23
+ context[:nodes] = nodes(context.website, options)
24
+ Webgen::Tag.render_tag_template(context, 'breadcrumb_trail')
25
+ end
26
+
27
+ # Return the list of nodes that make up the breadcrumb trail of a node while respecting the
28
+ # parameters.
29
+ #
30
+ # The options hash needs to include the following keys:
31
+ #
32
+ # [:alcn]
33
+ # The alcn of the node for which the breadcrumb trail should be generated.
34
+ #
35
+ # [:start_level]
36
+ # The start level (an index into an array).
37
+ #
38
+ # [:end_level]
39
+ # The end level (an index into an array).
40
+ #
41
+ # [:omit_dir_index]
42
+ # If set, omits the last path component if it is a directory index.
43
+ #
44
+ def self.nodes(website, options)
45
+ node = website.tree[options[:alcn]]
46
+ nodes = []
47
+ omit_dir_index = if node.meta_info.has_key?('omit_dir_index')
48
+ node['omit_dir_index']
49
+ else
50
+ options[:omit_dir_index]
51
+ end
52
+
53
+ node = node.parent if omit_dir_index && node.parent.proxy_node(node.lang) == node
54
+
55
+ until node == website.tree.dummy_root
56
+ nodes.unshift(node)
57
+ node = node.parent
58
+ end
59
+ nodes[options[:start_level]..options[:end_level]].to_a
60
+ end
61
+
62
+ end
63
+
64
+ end
65
+ end
@@ -1,42 +1,39 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
- module Webgen::Tag
4
-
5
- # Provides syntax highlighting via the +coderay+ library.
6
- class Coderay
7
-
8
- include Webgen::Tag::Base
9
- include Webgen::WebsiteAccess
10
-
11
- # Highlight the body of the block.
12
- def call(tag, body, context)
13
- require 'coderay'
14
-
15
- options = {}
16
- if param('tag.coderay.css').to_s == 'other'
17
- options[:css] = :class
18
- elsif param('tag.coderay.css').to_s == 'class'
19
- options[:css] = :class
20
- default_css_style_node = context.dest_node.resolve('/stylesheets/coderay-default.css')
21
- ((context.persistent[:cp_head] ||= {})[:css_file] ||= []) << context.dest_node.route_to(default_css_style_node)
22
- context.dest_node.node_info[:used_meta_info_nodes] << default_css_style_node.alcn
23
- else
24
- options[:css] = :style
3
+ webgen_require 'coderay'
4
+
5
+ module Webgen
6
+ class Tag
7
+
8
+ # Provides syntax highlighting via the +coderay+ library.
9
+ module Coderay
10
+
11
+ # Highlight the body of the block.
12
+ def self.call(tag, body, context)
13
+ config = context[:config]
14
+
15
+ options = {}
16
+ if config['tag.coderay.css'].to_s == 'other'
17
+ options[:css] = :class
18
+ elsif config['tag.coderay.css'].to_s == 'class'
19
+ options[:css] = :class
20
+ context.html_head.link_file(:css, '/stylesheets/coderay-default.css')
21
+ else
22
+ options[:css] = :style
23
+ end
24
+ options.merge!(:wrap => config['tag.coderay.wrap'].to_sym,
25
+ :line_numbers => (config['tag.coderay.line_numbers'] ? :inline : nil),
26
+ :line_number_start => config['tag.coderay.line_number_start'],
27
+ :tab_width => config['tag.coderay.tab_width'],
28
+ :bold_every => config['tag.coderay.bold_every'])
29
+
30
+ if config['tag.coderay.process_body']
31
+ body = context.website.ext.content_processor.call('tags', context.clone(:content => body)).content
32
+ end
33
+ CodeRay.scan(body, config['tag.coderay.lang'].to_sym).html(options)
25
34
  end
26
- options.merge!(:wrap => param('tag.coderay.wrap').to_sym,
27
- :line_numbers => (param('tag.coderay.line_numbers') ? :inline : nil),
28
- :line_number_start => param('tag.coderay.line_number_start'),
29
- :tab_width => param('tag.coderay.tab_width'),
30
- :bold_every => param('tag.coderay.bold_every'))
31
-
32
- if param('tag.coderay.process_body')
33
- body = website.blackboard.invoke(:content_processor, 'tags').call(context.clone(:content => body)).content
34
- end
35
- CodeRay.scan(body, param('tag.coderay.lang').to_sym).html(options)
36
- rescue LoadError
37
- raise Webgen::LoadError.new('coderay', self.class.name, context.dest_node, 'coderay')
35
+
38
36
  end
39
37
 
40
38
  end
41
-
42
39
  end