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
@@ -1,6 +1,6 @@
1
1
  description:
2
- This is the default website bundle. It only contains a sample index page sothat something is shown
3
- after a new website is created.
2
+ This is the default website bundle. It only contains a sample index page so that something is
3
+ shown after a new website is created.
4
4
 
5
5
  author:
6
6
  Thomas Leitner
@@ -2,75 +2,39 @@
2
2
 
3
3
  module Webgen
4
4
 
5
- # A blackboard object provides two features for inter-object communication:
5
+ # A blackboard object provides methods for inter-object communication. Objects may register
6
+ # themselves for specific messsage names and get notified when such a message gets dispatched.
6
7
  #
7
- # * *services*: An object can add a service to the blackboard which can be called by any other
8
- # object by just specifing the service name. Therefore it is easy to change the underlying
9
- # implementation of the service and there are no hard dependencies on specific class or method
10
- # names.
11
- #
12
- # * *listeners*: Objects may register themselves for specific messsage names and get notified when
13
- # such a message gets dispatched.
14
- #
15
- # For a list of all available services and messages have a look at the main Webgen documentation
16
- # page.
8
+ # For a list of all available messages have a look at the Webgen documentation page.
17
9
  class Blackboard
18
10
 
19
11
  # Create a new Blackboard object.
20
12
  def initialize
21
13
  @listener = {}
22
- @services = {}
23
14
  end
24
15
 
25
- # Add the +callable_object+ or the given block as listener for the messages +msg_names+ (one
26
- # message name or an array of message names).
27
- def add_listener(msg_names = nil, callable_object = nil, &block)
28
- callable_object = callable_object || block
29
- if !callable_object.nil?
30
- raise ArgumentError, "The listener needs to respond to 'call'" unless callable_object.respond_to?(:call)
31
- [msg_names].flatten.compact.each {|name| (@listener[name] ||= []) << callable_object}
16
+ # Add the given block as listener for the messages +msg_names+ (one message name or an array of
17
+ # message names). If you want to be able to remove the block from being called by the blackboard
18
+ # later, you have to provide a unique ID object!
19
+ def add_listener(msg_names = nil, id = nil, &block)
20
+ if !block.nil?
21
+ [msg_names].flatten.compact.each {|name| (@listener[name] ||= []) << [id, block]}
32
22
  else
33
- raise ArgumentError, "You have to provide a callback object or a block"
23
+ raise ArgumentError, "You have to provide a block"
34
24
  end
35
25
  end
36
26
 
37
- # Remove the given object from the dispatcher queues of the message names specified in
38
- # +msg_names+.
39
- def del_listener(msg_names, callable_object)
40
- [msg_names].flatten.each {|name| @listener[name].delete(callable_object) if @listener[name]}
27
+ # Remove the blocks associated with the given ID from the dispatcher queues of the given message
28
+ # names.
29
+ def remove_listener(msg_names, id)
30
+ [msg_names].flatten.each {|name| @listener[name].delete_if {|lid, b| lid == id} if @listener[name]}
41
31
  end
42
32
 
43
33
  # Dispatch the message +msg_name+ to all listeners for this message, passing the given
44
34
  # arguments.
45
35
  def dispatch_msg(msg_name, *args)
46
36
  return unless @listener[msg_name]
47
- @listener[msg_name].each {|obj| obj.call(*args)}
48
- end
49
-
50
- # Add a service named +service_name+ provided by the +callable_object+ or a block to the
51
- # blackboard.
52
- def add_service(service_name, callable_object = nil, &block)
53
- callable_object = callable_object || block
54
- if @services.has_key?(service_name)
55
- raise "The service name '#{service_name}' is already taken"
56
- else
57
- raise ArgumentError, "An object providing a service needs to respond to 'call'" unless callable_object.respond_to?(:call)
58
- @services[service_name] = callable_object
59
- end
60
- end
61
-
62
- # Delete the service +service_name+.
63
- def del_service(service_name)
64
- @services.delete(service_name)
65
- end
66
-
67
- # Invoke the service called +service_name+ with the given arguments.
68
- def invoke(service_name, *args, &block)
69
- if @services.has_key?(service_name)
70
- @services[service_name].call(*args, &block)
71
- else
72
- raise ArgumentError, "No such service named '#{service_name}' available"
73
- end
37
+ @listener[msg_name].each {|id, obj| obj.call(*args)}
74
38
  end
75
39
 
76
40
  end
@@ -0,0 +1,54 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # This file initializes the show-changes built-in extension.
4
+
5
+ option('destination.show_changes', false,
6
+ 'Show changes to destination paths') do |val|
7
+ raise "The value has to be 'true' or 'false'" unless val == true || val == false
8
+ val
9
+ end
10
+
11
+ data = nil
12
+
13
+ website.blackboard.add_listener(:before_node_written) do |node|
14
+ next unless website.config['destination.show_changes'] && node.is_file? && !node['no_output']
15
+ webgen_require('diff/lcs', 'diff-lcs')
16
+ webgen_require('diff/lcs/hunk', 'diff-lcs')
17
+ if website.ext.destination.exists?(node.dest_path)
18
+ data = website.ext.destination.read(node.dest_path)
19
+ else
20
+ data = nil
21
+ end
22
+ end
23
+
24
+ website.blackboard.add_listener(:after_node_written) do |node, content|
25
+ next unless website.config['destination.show_changes'] && node.is_file? && !node['no_output']
26
+ if data.nil?
27
+ website.logger.info { "New destination path <#{node.dest_path}>" }
28
+ next
29
+ end
30
+ new_data = (content.kind_of?(String) ? content : content.data)
31
+
32
+ binary = data[0...4096]["\0"] || new_data[0..4096]["\0"]
33
+ if binary
34
+ if data.force_encoding('BINARY') != new_data.force_encoding('BINARY')
35
+ website.logger.info { "Path <#{node.dest_path}> differs" }
36
+ end
37
+ else
38
+ data = data.split(/\n/).map! {|e| e.chomp }
39
+ new_data = new_data.split(/\n/).map! {|e| e.chomp }
40
+ diffs = Diff::LCS.diff(data, new_data)
41
+ next if diffs.empty?
42
+
43
+ length_diff = 0
44
+ diffs.each do |piece|
45
+ hunk = Diff::LCS::Hunk.new(data, new_data, piece, 0, length_diff)
46
+ length_diff = hunk.file_length_difference
47
+
48
+ hunk.diff(:unified).split(/\n/).each do |line|
49
+ website.logger.info { line }
50
+ end
51
+ end
52
+ end
53
+ end
54
+
@@ -0,0 +1,366 @@
1
+ # -*- encoding: utf-8 -*-
2
+ #
3
+ # This file initializes all the extensions shipped with webgen.
4
+
5
+ ########################################################################
6
+ # Used validators and other objects
7
+
8
+ true_or_false = lambda do |val|
9
+ raise "The value has to be 'true' or 'false'" unless val == true || val == false
10
+ val
11
+ end
12
+
13
+ is_string = lambda do |val|
14
+ raise "The value has to be a string" unless val.kind_of?(String)
15
+ val
16
+ end
17
+
18
+ is_array = lambda do |val|
19
+ raise "The value has to be an array" unless val.kind_of?(Array)
20
+ val
21
+ end
22
+
23
+ is_hash = lambda do |val|
24
+ raise "The value has to be a hash" unless val.kind_of?(Hash)
25
+ val
26
+ end
27
+
28
+ is_integer = lambda do |val|
29
+ raise "The value has to be an integer" unless val.kind_of?(Integer)
30
+ val
31
+ end
32
+
33
+ ########################################################################
34
+ # General configuration parameters
35
+
36
+ option('website.tmpdir', 'tmp',
37
+ 'Storage location relative to website directory for cache and temporary files created when webgen is run', &is_string)
38
+ option('website.cache', [:file, 'webgen.cache'],
39
+ 'The file name relative to website.tmpdir (or a string) from/to which the cache is read/written') do |val|
40
+ raise "The value has to be an array with two values" unless val.kind_of?(Array) && val.length == 2
41
+ raise "The first value has to be :file or :string" unless val[0] == :file || val[0] == :string
42
+ val
43
+ end
44
+ option('website.dry_run', false,
45
+ "Perform a dry run, don't actually write files", &true_or_false)
46
+
47
+ option('website.lang', 'en', 'The default language used for the website') do |val|
48
+ lang = LanguageManager.language_for_code(val)
49
+ raise "Unknown language code '#{val}'" if lang.nil?
50
+ lang
51
+ end
52
+
53
+
54
+ ########################################################################
55
+ # Everything related to the content processor extension
56
+ require 'webgen/content_processor'
57
+
58
+ website.ext.content_processor = content_processor = Webgen::ContentProcessor.new
59
+ content_processor.register('Blocks')
60
+ content_processor.register('Builder')
61
+ content_processor.register('Erb')
62
+
63
+ content_processor.register('Erubis')
64
+ option('content_processor.erubis.use_pi', false,
65
+ 'Specifies whether processing instructions should be used', &true_or_false)
66
+ option('content_processor.erubis.options', {},
67
+ 'A hash of additional, erubis specific options')
68
+
69
+ content_processor.register('Fragments')
70
+ content_processor.register('Haml', :ext_map => {'haml' => 'html'})
71
+ content_processor.register('HtmlHead')
72
+
73
+ content_processor.register('Kramdown')
74
+ option('content_processor.kramdown.options', {:auto_ids => true},
75
+ 'The options hash for the kramdown processor')
76
+ option('content_processor.kramdown.handle_links', true,
77
+ 'Whether all links in a kramdown document should be processed by webgen', &true_or_false)
78
+ option('content_processor.kramdown.ignore_unknown_fragments', false,
79
+ 'Specifies whether unknown, non-resolvable fragment parts should be ignored when handling links', &true_or_false)
80
+
81
+ content_processor.register('Maruku')
82
+ content_processor.register('RDiscount', :name => 'rdiscount')
83
+ content_processor.register('RDoc', :name => 'rdoc', :ext_map => {'rdoc' => 'html'})
84
+
85
+ content_processor.register('RedCloth', :name => 'redcloth', :ext_map => {'textile' => 'html'})
86
+ option('content_processor.redcloth.hard_breaks', false,
87
+ 'Specifies whether new lines are turned into hard breaks', &true_or_false)
88
+
89
+ content_processor.register('Ruby')
90
+
91
+ content_processor.register('Sass', :ext_map => {'sass' => 'css'})
92
+ content_processor.register('Scss', :ext_map => {'scss' => 'css'})
93
+ option('content_processor.sass.options', {},
94
+ 'Additional Sass options (also used by the scss processor)', &is_hash)
95
+ website.ext.sass_load_paths = []
96
+
97
+ content_processor.register('Tags')
98
+
99
+ content_processor.register('Tidy')
100
+ option('content_processor.tidy.options', "-raw",
101
+ "Additional options passed to the tidy command (-q and -f are always used)", &is_string)
102
+
103
+ content_processor.register('Tikz', :ext_map => {'tikz' => 'png'})
104
+ option('content_processor.tikz.libraries', [],
105
+ 'An array of additional TikZ library names', &is_array)
106
+ option('content_processor.tikz.opts', '',
107
+ 'A string with global options for the tikzpicture environment', &is_string)
108
+ option('content_processor.tikz.resolution', '72 72',
109
+ 'A string specifying the render and output resolutions, separated by whitespace') do |val|
110
+ raise "The value has to be a string in the format 'RENDER_RES OUTPUT_RES'" unless val.kind_of?(String) && val =~ /^\d+\s+\d+$/
111
+ val
112
+ end
113
+ option('content_processor.tikz.transparent', false,
114
+ 'Specifies whether the generated image should be transparent (only if the extension is png)', &true_or_false)
115
+
116
+ content_processor.register('Xmllint')
117
+ option('content_processor.xmllint.options', "--catalogs --noout --valid",
118
+ 'Options passed to the xmllint command', &is_string)
119
+
120
+
121
+ ########################################################################
122
+ # The Context extensions
123
+ website.ext.context_modules = []
124
+
125
+
126
+ ########################################################################
127
+ # Everything related to the destination extension
128
+ require 'webgen/destination'
129
+
130
+ option('destination', [:file_system, 'out'],
131
+ 'The destination extension which is used to output the generated paths.') do |val|
132
+ raise "The value needs to be an array with at least one value (the destination extension name)" unless val.kind_of?(Array) && val.length >=1
133
+ val
134
+ end
135
+
136
+ website.ext.destination = destination = Webgen::Destination.new(website)
137
+ destination.register("FileSystem")
138
+
139
+ # TODO: Do we really need this option?
140
+ #config.output.do_deletion(false, :doc => 'Specifies whether the generated output paths should be deleted once the sources are deleted')
141
+
142
+
143
+ ########################################################################
144
+ # Everything related to the item tracker extension
145
+ require 'webgen/item_tracker'
146
+
147
+ website.ext.item_tracker = item_tracker = Webgen::ItemTracker.new(website)
148
+ item_tracker.register('NodeContent')
149
+
150
+ item_tracker.register('NodeMetaInfo')
151
+ website.blackboard.add_listener(:after_node_created) do |node|
152
+ item_tracker.add(node, :node_meta_info, node.alcn)
153
+ item_tracker.add(node, :node_meta_info, node.alcn, Webgen::ItemTracker::NodeMetaInfo::CONTENT_MODIFICATION_KEY)
154
+ end
155
+
156
+ item_tracker.register('Nodes')
157
+ item_tracker.register('File')
158
+ item_tracker.register('MissingNode')
159
+ website.blackboard.add_listener(:node_resolution_failed) do |path, lang|
160
+ website.ext.item_tracker.add(website.ext.path_handler.current_dest_node, :missing_node, path, lang)
161
+ website.logger.error do
162
+ ["Could not resolve '#{path}' in language '#{lang}' in <#{website.ext.path_handler.current_dest_node}>",
163
+ "webgen will automatically try to resolve this error by rendering this path again later.",
164
+ "If the error persists, the content of the path in question needs to be edited to correct the error."]
165
+ end
166
+ end
167
+
168
+ ########################################################################
169
+ # Everything related to the node finder extension
170
+ require 'webgen/node_finder'
171
+
172
+ website.ext.node_finder = Webgen::NodeFinder.new(website)
173
+
174
+
175
+ ########################################################################
176
+ # Everything related to the path handler extension
177
+ require 'webgen/path_handler'
178
+
179
+ option('path_handler.patterns.case_sensitive', false,
180
+ 'Specifies whether patterns are considered to be case sensitive', &true_or_false)
181
+ option('path_handler.patterns.match_leading_dot', false,
182
+ 'Specifies whether paths parts starting with a dot are matched', &true_or_false)
183
+ option('path_handler.lang_code_in_dest_path', 'except_default',
184
+ 'Specifies whether destination paths should use the language part in their name') do |val|
185
+ if val == true || val == false || val == 'except_default'
186
+ val
187
+ else
188
+ raise "The value has to be 'true', 'false' or 'except_default'"
189
+ end
190
+ end
191
+ option('path_handler.version_in_dest_path', 'except_default',
192
+ 'Specifies whether destination paths should use the version name in their name') do |val|
193
+ if val == true || val == false || val == 'except_default'
194
+ val
195
+ else
196
+ raise "The value has to be 'true', 'false' or 'except_default'"
197
+ end
198
+ end
199
+
200
+ website.ext.path_handler = path_handler = Webgen::PathHandler.new(website)
201
+
202
+ # handlers are registered in invocation order
203
+
204
+ path_handler.register('Directory')
205
+ path_handler.register('MetaInfo', :patterns => ['/**/metainfo', '/**/*.metainfo'])
206
+
207
+ path_handler.register('Template')
208
+ option('path_handler.template.default_template', 'default.template',
209
+ 'The name of the default template file')
210
+
211
+ path_handler.register('Page')
212
+ path_handler.register('Copy')
213
+ path_handler.register('Feed')
214
+ path_handler.register('Sitemap')
215
+ path_handler.register('Virtual')
216
+
217
+
218
+ ########################################################################
219
+ # Everything related to the source extension
220
+ require 'webgen/source'
221
+
222
+ sources_validator = lambda do |val|
223
+ raise "The value has to be an array of arrays" unless val.kind_of?(Array) && val.all? {|item| item.kind_of?(Array)}
224
+ raise "Each sub array needs to specify at least the mount point and source extension name" unless val.all? {|item| item.length >= 2}
225
+ val
226
+ end
227
+
228
+ option('sources', [['/', :file_system, 'src']],
229
+ 'One or more sources from which paths are read', &sources_validator)
230
+ option('sources.ignore_paths', ['**/*~', '**/.svn/**'],
231
+ 'Patterns for paths that should be ignored') do |val|
232
+ raise "The value has to be an array of patterns" unless val.kind_of?(Array) && val.all? {|item| item.kind_of?(String)}
233
+ val
234
+ end
235
+
236
+ website.ext.source = source = Webgen::Source.new(website)
237
+ source.register("FileSystem")
238
+ source.register("Stacked")
239
+ source.register("TarArchive")
240
+
241
+ source.passive_sources << ['/', :file_system, File.join(Webgen::Utils.data_dir, 'passive_sources')]
242
+
243
+
244
+ ########################################################################
245
+ # Everything related to the tag extension
246
+ require 'webgen/tag'
247
+
248
+ website.ext.tag = tag = Webgen::Tag.new(website)
249
+
250
+ option('tag.prefix', '',
251
+ 'The prefix used for tag names to avoid name clashes when another content processor uses similar markup.',
252
+ &is_string)
253
+
254
+ tag.register('Date')
255
+ option('tag.date.format', '%Y-%m-%d %H:%M:%S',
256
+ 'The format of the date (same options as Ruby\'s Time#strftime)', &is_string)
257
+
258
+ tag.register('MetaInfo', :names => :default)
259
+ option('tag.meta_info.escape_html', true,
260
+ 'Special HTML characters in the output will be escaped if true', &true_or_false)
261
+
262
+ tag.register('Relocatable', :names => ['relocatable', 'r'], :mandatory => ['path'])
263
+ option('tag.relocatable.path', nil,
264
+ 'The path which should be made relocatable', &is_string)
265
+ option('tag.relocatable.ignore_unknown_fragment', false,
266
+ 'Specifies whether an unknown, non-resolvable fragment part should be ignored', &true_or_false)
267
+
268
+ tag.register('Link', :mandatory => ['path'])
269
+ option('tag.link.path', nil,
270
+ 'The (A)LCN path to which a link should be generated', &is_string)
271
+ option('tag.link.attr', {},
272
+ 'A hash of additional HTML attributes that should be set on the link', &is_hash)
273
+
274
+ tag.register('ExecuteCommand', :names => 'execute_cmd', :mandatory => ['command'])
275
+ option('tag.execute_command.command', nil,
276
+ 'The command which should be executed', &is_string)
277
+ option('tag.execute_command.process_output', true,
278
+ 'The output of the command will be scanned for tags if true', &true_or_false)
279
+ option('tag.execute_command.escape_html', true,
280
+ 'Special HTML characters in the output will be escaped if true', &true_or_false)
281
+
282
+ tag.register('IncludeFile', :mandatory => ['filename'])
283
+ option('tag.include_file.filename', nil,
284
+ 'The name of the file which should be included (relative to the website).', &is_string)
285
+ option('tag.include_file.process_output', true,
286
+ 'The file content will be scanned for tags if true.', &true_or_false)
287
+ option('tag.include_file.escape_html', true,
288
+ 'Special HTML characters in the file content will be escaped if true.', &true_or_false)
289
+
290
+ tag.register('Coderay', :mandatory => ['lang'])
291
+ option('tag.coderay.lang', 'ruby',
292
+ 'The language used for highlighting')
293
+ option('tag.coderay.process_body', true,
294
+ 'The tag body will be scanned for tags before highlighting if true', &true_or_false)
295
+ option('tag.coderay.wrap', :div,
296
+ 'Specifies how the code should be wrapped, either "div" or "span"') do |val|
297
+ val = val.to_s.intern
298
+ raise "The value has to be either div or span" unless val == :div || val == :span
299
+ val
300
+ end
301
+ option('tag.coderay.css', 'style',
302
+ 'Specifies how the highlighted code should be styled') do |val|
303
+ val = val.to_s
304
+ raise "The value has to be class, style or other" unless %w[class style other].include?(val)
305
+ val
306
+ end
307
+ option('tag.coderay.line_numbers', true,
308
+ 'Show line numbers', &true_or_false)
309
+ option('tag.coderay.line_number_start', 1,
310
+ 'Line number of first line', &is_integer)
311
+ option('tag.coderay.bold_every', 10,
312
+ 'The interval at which the line number appears bold', &is_integer)
313
+ option('tag.coderay.tab_width', 8,
314
+ 'Number of spaces used for a tabulator', &is_integer)
315
+
316
+ tag.register('Tikz', :mandatory => ['path'])
317
+ option('tag.tikz.path', nil,
318
+ 'The path for the created image', &is_string)
319
+ option('tag.tikz.img_attr', {},
320
+ 'A hash of additional HTML attributes for the created img tag', &is_hash)
321
+
322
+ tag.register('Langbar')
323
+ option('tag.langbar.show_single_lang', true,
324
+ 'Should the link be shown although the page is only available in one language?', &true_or_false)
325
+ option('tag.langbar.show_own_lang', true,
326
+ 'Should the link to the currently displayed language page be shown?', &true_or_false)
327
+ option('tag.langbar.template', '/templates/tag.template',
328
+ 'The block \'tag.langbar\' in this template file is used for rendering')
329
+ option('tag.langbar.separator', ' | ',
330
+ 'Specifies the string that should be used as separator between the individual language parts.')
331
+
332
+ tag.register('BreadcrumbTrail')
333
+ option('tag.breadcrumb_trail.omit_dir_index', false,
334
+ 'Omit the last path component if it is an index path', &true_or_false)
335
+ option('tag.breadcrumb_trail.start_level', 0,
336
+ 'The level at which the breadcrumb trail starts (starting at 0)', &is_integer)
337
+ option('tag.breadcrumb_trail.end_level', -1,
338
+ 'The level at which the breadcrumb trail ends (starting at 0)', &is_integer)
339
+ option('tag.breadcrumb_trail.separator', ' / ',
340
+ 'The separator string which appears between the breadcrumb links', &is_string)
341
+ option('tag.breadcrumb_trail.template', '/templates/tag.template',
342
+ 'The block \'tag.breadcrumb_trail\' in this template file is used for rendering')
343
+
344
+ tag.register('Menu')
345
+ option('tag.menu.style', 'nested',
346
+ 'The menu rendering style to be used, either nested or flat') do |val|
347
+ raise "The value has to be 'nested' or 'flat'" unless %w[nested flat].include?(val.to_s)
348
+ val.to_s
349
+ end
350
+ option('tag.menu.options', {},
351
+ 'Node finder options that specify which nodes the menu should use')
352
+ option('tag.menu.template', '/templates/tag.template',
353
+ 'The block \'tag.menu\' in this template file is used for rendering')
354
+
355
+
356
+ ########################################################################
357
+ # Everything related to the task extension
358
+ require 'webgen/task'
359
+
360
+ website.ext.task = task = Webgen::Task.new(website)
361
+ task.register('GenerateWebsite')
362
+ task.register('CreateWebsite', :data => {:templates => {}})
363
+ task.register('CreateBundle')
364
+
365
+
366
+ load("built-in-show-changes")