webgen 0.5.17 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (408) hide show
  1. data/API.rdoc +143 -0
  2. data/AUTHORS +0 -1
  3. data/COPYING +17 -8
  4. data/ChangeLog +4456 -0
  5. data/GPL +623 -289
  6. data/README.md +71 -0
  7. data/Rakefile +87 -99
  8. data/VERSION +1 -1
  9. data/bin/webgen +1 -7
  10. data/data/webgen/basic_website_template/ext/init.rb +15 -0
  11. data/data/webgen/basic_website_template/webgen.config +18 -0
  12. data/data/webgen/bundle_template_files/README.md.erb +24 -0
  13. data/data/webgen/bundle_template_files/Rakefile.erb +36 -0
  14. data/data/webgen/bundle_template_files/info.yaml.erb +16 -0
  15. data/data/webgen/bundle_template_files/init.rb.erb +1 -0
  16. data/data/webgen/passive_sources/default.metainfo +32 -0
  17. data/data/webgen/passive_sources/stylesheets/coderay-default.css +109 -118
  18. data/data/webgen/passive_sources/templates/feed.template +62 -0
  19. data/data/webgen/passive_sources/templates/sitemap.template +3 -6
  20. data/data/webgen/passive_sources/templates/tag.template +42 -0
  21. data/data/webgen/website_bundles/default/README +2 -2
  22. data/lib/webgen/blackboard.rb +15 -51
  23. data/lib/webgen/bundle/built-in-show-changes/init.rb +54 -0
  24. data/lib/webgen/bundle/built-in/init.rb +366 -0
  25. data/lib/webgen/bundle_loader.rb +126 -0
  26. data/lib/webgen/cache.rb +9 -18
  27. data/lib/webgen/cli.rb +131 -58
  28. data/lib/webgen/cli/bundle_command.rb +30 -0
  29. data/lib/webgen/cli/create_bundle_command.rb +46 -0
  30. data/lib/webgen/cli/create_command.rb +48 -60
  31. data/lib/webgen/cli/generate_command.rb +25 -0
  32. data/lib/webgen/cli/install_bundle_command.rb +34 -0
  33. data/lib/webgen/cli/list_bundle_command.rb +108 -0
  34. data/lib/webgen/cli/logger.rb +45 -0
  35. data/lib/webgen/cli/show_command.rb +30 -0
  36. data/lib/webgen/cli/show_config_command.rb +63 -0
  37. data/lib/webgen/cli/show_dependencies_command.rb +103 -0
  38. data/lib/webgen/cli/show_extensions_command.rb +74 -0
  39. data/lib/webgen/cli/utils.rb +68 -95
  40. data/lib/webgen/configuration.rb +143 -105
  41. data/lib/webgen/content_processor.rb +160 -0
  42. data/lib/webgen/content_processor/blocks.rb +96 -0
  43. data/lib/webgen/content_processor/builder.rb +25 -0
  44. data/lib/webgen/content_processor/erb.rb +25 -0
  45. data/lib/webgen/content_processor/erubis.rb +31 -0
  46. data/lib/webgen/content_processor/fragments.rb +82 -0
  47. data/lib/webgen/content_processor/haml.rb +25 -0
  48. data/lib/webgen/content_processor/html_head.rb +157 -0
  49. data/lib/webgen/content_processor/kramdown.rb +49 -0
  50. data/lib/webgen/content_processor/maruku.rb +39 -0
  51. data/lib/webgen/content_processor/r_discount.rb +21 -0
  52. data/lib/webgen/content_processor/rdoc.rb +22 -0
  53. data/lib/webgen/content_processor/redcloth.rb +23 -0
  54. data/lib/webgen/content_processor/ruby.rb +20 -0
  55. data/lib/webgen/content_processor/sass.rb +145 -0
  56. data/lib/webgen/content_processor/scss.rb +23 -0
  57. data/lib/webgen/content_processor/tags.rb +30 -0
  58. data/lib/webgen/content_processor/tidy.rb +32 -0
  59. data/lib/webgen/content_processor/tikz.rb +116 -0
  60. data/lib/webgen/content_processor/xmllint.rb +31 -0
  61. data/lib/webgen/context.rb +57 -29
  62. data/lib/webgen/context/html_head.rb +60 -0
  63. data/lib/webgen/context/nodes.rb +32 -27
  64. data/lib/webgen/context/rendering.rb +39 -0
  65. data/lib/webgen/context/webgen_tags.rb +25 -0
  66. data/lib/webgen/core_ext.rb +25 -0
  67. data/lib/webgen/destination.rb +151 -0
  68. data/lib/webgen/destination/file_system.rb +62 -0
  69. data/lib/webgen/error.rb +59 -49
  70. data/lib/webgen/extension_manager.rb +121 -0
  71. data/lib/webgen/item_tracker.rb +237 -0
  72. data/lib/webgen/item_tracker/file.rb +39 -0
  73. data/lib/webgen/item_tracker/missing_node.rb +61 -0
  74. data/lib/webgen/item_tracker/node_content.rb +40 -0
  75. data/lib/webgen/item_tracker/node_meta_info.rb +53 -0
  76. data/lib/webgen/item_tracker/nodes.rb +92 -0
  77. data/lib/webgen/logger.rb +26 -82
  78. data/lib/webgen/node.rb +122 -367
  79. data/lib/webgen/node_finder.rb +336 -0
  80. data/lib/webgen/page.rb +48 -85
  81. data/lib/webgen/path.rb +218 -156
  82. data/lib/webgen/path_handler.rb +400 -0
  83. data/lib/webgen/path_handler/base.rb +220 -0
  84. data/lib/webgen/path_handler/copy.rb +78 -0
  85. data/lib/webgen/path_handler/directory.rb +21 -0
  86. data/lib/webgen/path_handler/feed.rb +82 -0
  87. data/lib/webgen/path_handler/meta_info.rb +84 -0
  88. data/lib/webgen/path_handler/page.rb +38 -0
  89. data/lib/webgen/path_handler/page_utils.rb +79 -0
  90. data/lib/webgen/path_handler/sitemap.rb +52 -0
  91. data/lib/webgen/path_handler/template.rb +96 -0
  92. data/lib/webgen/path_handler/virtual.rb +85 -0
  93. data/lib/webgen/{webgentask.rb → rake_task.rb} +31 -27
  94. data/lib/webgen/source.rb +106 -24
  95. data/lib/webgen/source/file_system.rb +41 -0
  96. data/lib/webgen/source/stacked.rb +49 -53
  97. data/lib/webgen/source/tar_archive.rb +59 -0
  98. data/lib/webgen/tag.rb +250 -19
  99. data/lib/webgen/tag/breadcrumb_trail.rb +65 -0
  100. data/lib/webgen/tag/coderay.rb +32 -35
  101. data/lib/webgen/tag/date.rb +9 -9
  102. data/lib/webgen/tag/execute_command.rb +31 -0
  103. data/lib/webgen/tag/include_file.rb +32 -0
  104. data/lib/webgen/tag/langbar.rb +31 -47
  105. data/lib/webgen/tag/link.rb +17 -18
  106. data/lib/webgen/tag/menu.rb +27 -189
  107. data/lib/webgen/tag/meta_info.rb +31 -0
  108. data/lib/webgen/tag/relocatable.rb +48 -39
  109. data/lib/webgen/tag/tikz.rb +24 -100
  110. data/lib/webgen/task.rb +99 -0
  111. data/lib/webgen/task/create_bundle.rb +73 -0
  112. data/lib/webgen/task/create_website.rb +94 -0
  113. data/lib/webgen/task/generate_website.rb +47 -0
  114. data/lib/webgen/test_helper.rb +183 -0
  115. data/lib/webgen/tree.rb +95 -46
  116. data/lib/webgen/utils.rb +39 -0
  117. data/lib/webgen/utils/external_command.rb +27 -0
  118. data/lib/webgen/utils/tag_parser.rb +124 -0
  119. data/lib/webgen/version.rb +1 -1
  120. data/lib/webgen/website.rb +134 -296
  121. data/setup.rb +1 -1
  122. data/test/test_documentation.rb +43 -0
  123. data/test/webgen/cli/test_logger.rb +41 -0
  124. data/test/{test_contentprocessor_blocks.rb → webgen/content_processor/test_blocks.rb} +30 -28
  125. data/test/webgen/content_processor/test_builder.rb +25 -0
  126. data/test/webgen/content_processor/test_erb.rb +21 -0
  127. data/test/webgen/content_processor/test_erubis.rb +33 -0
  128. data/test/webgen/content_processor/test_fragments.rb +96 -0
  129. data/test/webgen/content_processor/test_haml.rb +24 -0
  130. data/test/webgen/content_processor/test_html_head.rb +78 -0
  131. data/test/webgen/content_processor/test_kramdown.rb +49 -0
  132. data/test/webgen/content_processor/test_maruku.rb +30 -0
  133. data/test/webgen/content_processor/test_r_discount.rb +18 -0
  134. data/test/webgen/content_processor/test_rdoc.rb +18 -0
  135. data/test/webgen/content_processor/test_redcloth.rb +23 -0
  136. data/test/webgen/content_processor/test_ruby.rb +24 -0
  137. data/test/webgen/content_processor/test_sass.rb +44 -0
  138. data/test/webgen/content_processor/test_scss.rb +23 -0
  139. data/test/webgen/content_processor/test_tags.rb +44 -0
  140. data/test/webgen/content_processor/test_tidy.rb +31 -0
  141. data/test/webgen/content_processor/test_tikz.rb +33 -0
  142. data/test/webgen/content_processor/test_xmllint.rb +32 -0
  143. data/test/webgen/destination/test_file_system.rb +54 -0
  144. data/test/webgen/item_tracker/test_file.rb +31 -0
  145. data/test/webgen/item_tracker/test_missing_node.rb +70 -0
  146. data/test/webgen/item_tracker/test_node_content.rb +42 -0
  147. data/test/webgen/item_tracker/test_node_meta_info.rb +44 -0
  148. data/test/webgen/item_tracker/test_nodes.rb +61 -0
  149. data/test/webgen/path_handler/test_base.rb +153 -0
  150. data/test/webgen/path_handler/test_copy.rb +56 -0
  151. data/test/webgen/path_handler/test_feed.rb +85 -0
  152. data/test/webgen/path_handler/test_meta_info.rb +98 -0
  153. data/test/webgen/path_handler/test_page.rb +25 -0
  154. data/test/webgen/path_handler/test_page_utils.rb +59 -0
  155. data/test/webgen/path_handler/test_sitemap.rb +95 -0
  156. data/test/webgen/path_handler/test_template.rb +64 -0
  157. data/test/webgen/path_handler/test_virtual.rb +87 -0
  158. data/test/webgen/source/test_file_system.rb +51 -0
  159. data/test/webgen/source/test_stacked.rb +35 -0
  160. data/test/{test_source_tararchive.rb → webgen/source/test_tar_archive.rb} +10 -25
  161. data/test/webgen/tag/test_breadcrumb_trail.rb +66 -0
  162. data/test/webgen/tag/test_coderay.rb +34 -0
  163. data/test/webgen/tag/test_date.rb +18 -0
  164. data/test/webgen/tag/test_execute_command.rb +36 -0
  165. data/test/webgen/tag/test_include_file.rb +35 -0
  166. data/test/webgen/tag/test_langbar.rb +50 -0
  167. data/test/webgen/tag/test_link.rb +40 -0
  168. data/test/webgen/tag/test_menu.rb +61 -0
  169. data/test/webgen/tag/test_meta_info.rb +25 -0
  170. data/test/webgen/tag/test_relocatable.rb +50 -0
  171. data/test/webgen/tag/test_tikz.rb +41 -0
  172. data/test/webgen/task/test_create_website.rb +46 -0
  173. data/test/webgen/test_blackboard.rb +31 -0
  174. data/test/webgen/test_bundle_loader.rb +55 -0
  175. data/test/{test_cache.rb → webgen/test_cache.rb} +3 -15
  176. data/test/webgen/test_cli.rb +41 -0
  177. data/test/webgen/test_configuration.rb +131 -0
  178. data/test/webgen/test_content_processor.rb +86 -0
  179. data/test/webgen/test_context.rb +73 -0
  180. data/test/webgen/test_core_ext.rb +20 -0
  181. data/test/webgen/test_destination.rb +48 -0
  182. data/test/webgen/test_error.rb +121 -0
  183. data/test/webgen/test_extension_manager.rb +70 -0
  184. data/test/webgen/test_item_tracker.rb +106 -0
  185. data/test/{test_languages.rb → webgen/test_languages.rb} +4 -4
  186. data/test/webgen/test_logger.rb +46 -0
  187. data/test/webgen/test_node.rb +178 -0
  188. data/test/webgen/test_node_finder.rb +127 -0
  189. data/test/{test_page.rb → webgen/test_page.rb} +44 -48
  190. data/test/webgen/test_path.rb +271 -0
  191. data/test/{test_webgentask.rb → webgen/test_rake_task.rb} +4 -4
  192. data/test/webgen/test_source.rb +59 -0
  193. data/test/webgen/test_tag.rb +137 -0
  194. data/test/webgen/test_task.rb +40 -0
  195. data/test/webgen/test_tree.rb +147 -0
  196. data/test/webgen/test_utils.rb +16 -0
  197. data/test/webgen/test_website.rb +45 -0
  198. data/test/webgen/utils/test_tag_parser.rb +99 -0
  199. metadata +292 -344
  200. data/data/webgen/passive_sources/templates/atom_feed.template +0 -39
  201. data/data/webgen/passive_sources/templates/rss_feed.template +0 -28
  202. data/data/webgen/resources.yaml +0 -4
  203. data/data/webgen/webgui/app.rb +0 -11
  204. data/data/webgen/webgui/controller/main.rb +0 -135
  205. data/data/webgen/webgui/layout/default.xhtml +0 -40
  206. data/data/webgen/webgui/overrides/win32console.rb +0 -0
  207. data/data/webgen/webgui/public/css/jquery.autocomplete.css +0 -50
  208. data/data/webgen/webgui/public/css/ramaze_error.css +0 -90
  209. data/data/webgen/webgui/public/css/style.css +0 -55
  210. data/data/webgen/webgui/public/img/headerbg.jpg +0 -0
  211. data/data/webgen/webgui/public/img/webgen_logo.png +0 -0
  212. data/data/webgen/webgui/public/js/jquery.autocomplete.js +0 -15
  213. data/data/webgen/webgui/public/js/jquery.js +0 -32
  214. data/data/webgen/webgui/start.rb +0 -9
  215. data/data/webgen/webgui/view/create_website.xhtml +0 -14
  216. data/data/webgen/webgui/view/error.xhtml +0 -64
  217. data/data/webgen/webgui/view/index.xhtml +0 -22
  218. data/data/webgen/webgui/view/manage_website.xhtml +0 -18
  219. data/data/webgen/website_skeleton/README +0 -10
  220. data/data/webgen/website_skeleton/Rakefile +0 -69
  221. data/data/webgen/website_skeleton/config.yaml +0 -35
  222. data/data/webgen/website_skeleton/ext/init.rb +0 -10
  223. data/doc/contentprocessor.template +0 -11
  224. data/doc/contentprocessor/blocks.page +0 -129
  225. data/doc/contentprocessor/builder.page +0 -79
  226. data/doc/contentprocessor/erb.page +0 -60
  227. data/doc/contentprocessor/erubis.page +0 -46
  228. data/doc/contentprocessor/fragments.page +0 -26
  229. data/doc/contentprocessor/haml.page +0 -46
  230. data/doc/contentprocessor/head.page +0 -31
  231. data/doc/contentprocessor/kramdown.page +0 -49
  232. data/doc/contentprocessor/less.page +0 -34
  233. data/doc/contentprocessor/maruku.page +0 -44
  234. data/doc/contentprocessor/rdiscount.page +0 -37
  235. data/doc/contentprocessor/rdoc.page +0 -36
  236. data/doc/contentprocessor/redcloth.page +0 -41
  237. data/doc/contentprocessor/sass.page +0 -31
  238. data/doc/contentprocessor/scss.page +0 -39
  239. data/doc/contentprocessor/tags.page +0 -73
  240. data/doc/contentprocessor/tidy.page +0 -14
  241. data/doc/contentprocessor/xmllint.page +0 -14
  242. data/doc/extensions.metainfo +0 -29
  243. data/doc/extensions.page +0 -15
  244. data/doc/extensions.template +0 -17
  245. data/doc/faq.page +0 -222
  246. data/doc/getting_started.page +0 -135
  247. data/doc/index.page +0 -71
  248. data/doc/manual.page +0 -727
  249. data/doc/reference_configuration.page +0 -1254
  250. data/doc/reference_metainfo.page +0 -265
  251. data/doc/reference_website_styles.page +0 -32
  252. data/doc/source/filesystem.page +0 -41
  253. data/doc/source/tararchive.page +0 -40
  254. data/doc/sourcehandler.template +0 -23
  255. data/doc/sourcehandler/copy.page +0 -19
  256. data/doc/sourcehandler/directory.page +0 -27
  257. data/doc/sourcehandler/feed.page +0 -102
  258. data/doc/sourcehandler/metainfo.page +0 -48
  259. data/doc/sourcehandler/page.page +0 -14
  260. data/doc/sourcehandler/sitemap.page +0 -46
  261. data/doc/sourcehandler/template.page +0 -45
  262. data/doc/sourcehandler/virtual.page +0 -49
  263. data/doc/tag.template +0 -25
  264. data/doc/tag/breadcrumbtrail.page +0 -40
  265. data/doc/tag/coderay.page +0 -53
  266. data/doc/tag/date.page +0 -31
  267. data/doc/tag/executecommand.page +0 -26
  268. data/doc/tag/includefile.page +0 -32
  269. data/doc/tag/langbar.page +0 -47
  270. data/doc/tag/link.page +0 -44
  271. data/doc/tag/menu.page +0 -109
  272. data/doc/tag/metainfo.page +0 -29
  273. data/doc/tag/relocatable.page +0 -38
  274. data/doc/tag/sitemap.page +0 -31
  275. data/doc/tag/tikz.page +0 -159
  276. data/doc/upgrading.page +0 -138
  277. data/doc/webgen_page_format.page +0 -129
  278. data/doc/website_styles.metainfo +0 -8
  279. data/lib/webgen/cli/apply_command.rb +0 -66
  280. data/lib/webgen/cli/run_command.rb +0 -22
  281. data/lib/webgen/cli/webgui_command.rb +0 -68
  282. data/lib/webgen/common.rb +0 -27
  283. data/lib/webgen/common/sitemap.rb +0 -83
  284. data/lib/webgen/contentprocessor.rb +0 -117
  285. data/lib/webgen/contentprocessor/blocks.rb +0 -92
  286. data/lib/webgen/contentprocessor/builder.rb +0 -29
  287. data/lib/webgen/contentprocessor/erb.rb +0 -26
  288. data/lib/webgen/contentprocessor/erubis.rb +0 -39
  289. data/lib/webgen/contentprocessor/fragments.rb +0 -25
  290. data/lib/webgen/contentprocessor/haml.rb +0 -34
  291. data/lib/webgen/contentprocessor/head.rb +0 -128
  292. data/lib/webgen/contentprocessor/kramdown.rb +0 -27
  293. data/lib/webgen/contentprocessor/kramdown/html.rb +0 -36
  294. data/lib/webgen/contentprocessor/less.rb +0 -35
  295. data/lib/webgen/contentprocessor/maruku.rb +0 -36
  296. data/lib/webgen/contentprocessor/rdiscount.rb +0 -19
  297. data/lib/webgen/contentprocessor/rdoc.rb +0 -20
  298. data/lib/webgen/contentprocessor/redcloth.rb +0 -21
  299. data/lib/webgen/contentprocessor/sass.rb +0 -22
  300. data/lib/webgen/contentprocessor/scss.rb +0 -22
  301. data/lib/webgen/contentprocessor/tags.rb +0 -170
  302. data/lib/webgen/contentprocessor/tidy.rb +0 -38
  303. data/lib/webgen/contentprocessor/xmllint.rb +0 -37
  304. data/lib/webgen/context/render.rb +0 -32
  305. data/lib/webgen/context/tags.rb +0 -20
  306. data/lib/webgen/coreext.rb +0 -13
  307. data/lib/webgen/default_config.rb +0 -240
  308. data/lib/webgen/loggable.rb +0 -25
  309. data/lib/webgen/output.rb +0 -86
  310. data/lib/webgen/output/filesystem.rb +0 -69
  311. data/lib/webgen/source/filesystem.rb +0 -61
  312. data/lib/webgen/source/resource.rb +0 -45
  313. data/lib/webgen/source/tararchive.rb +0 -78
  314. data/lib/webgen/sourcehandler.rb +0 -275
  315. data/lib/webgen/sourcehandler/base.rb +0 -281
  316. data/lib/webgen/sourcehandler/copy.rb +0 -44
  317. data/lib/webgen/sourcehandler/directory.rb +0 -30
  318. data/lib/webgen/sourcehandler/feed.rb +0 -92
  319. data/lib/webgen/sourcehandler/fragment.rb +0 -70
  320. data/lib/webgen/sourcehandler/memory.rb +0 -42
  321. data/lib/webgen/sourcehandler/metainfo.rb +0 -128
  322. data/lib/webgen/sourcehandler/page.rb +0 -64
  323. data/lib/webgen/sourcehandler/sitemap.rb +0 -60
  324. data/lib/webgen/sourcehandler/template.rb +0 -66
  325. data/lib/webgen/sourcehandler/virtual.rb +0 -117
  326. data/lib/webgen/tag/base.rb +0 -170
  327. data/lib/webgen/tag/breadcrumbtrail.rb +0 -70
  328. data/lib/webgen/tag/executecommand.rb +0 -31
  329. data/lib/webgen/tag/includefile.rb +0 -42
  330. data/lib/webgen/tag/metainfo.rb +0 -27
  331. data/lib/webgen/tag/sitemap.rb +0 -41
  332. data/lib/webgen/websiteaccess.rb +0 -31
  333. data/lib/webgen/websitemanager.rb +0 -125
  334. data/misc/default.css +0 -403
  335. data/misc/default.template +0 -76
  336. data/misc/htmldoc.metainfo +0 -26
  337. data/misc/htmldoc.virtual +0 -17
  338. data/misc/images/arrow.gif +0 -0
  339. data/misc/images/error.png +0 -0
  340. data/misc/images/headerbg.jpg +0 -0
  341. data/misc/images/important.png +0 -0
  342. data/misc/images/information.png +0 -0
  343. data/misc/images/quote.gif +0 -0
  344. data/misc/images/warning.png +0 -0
  345. data/misc/logo.svg +0 -313
  346. data/misc/style.page +0 -33
  347. data/test/helper.rb +0 -61
  348. data/test/test_blackboard.rb +0 -60
  349. data/test/test_cli.rb +0 -119
  350. data/test/test_common_sitemap.rb +0 -58
  351. data/test/test_configuration.rb +0 -68
  352. data/test/test_contentprocessor.rb +0 -39
  353. data/test/test_contentprocessor_builder.rb +0 -41
  354. data/test/test_contentprocessor_erb.rb +0 -33
  355. data/test/test_contentprocessor_erubis.rb +0 -62
  356. data/test/test_contentprocessor_fragments.rb +0 -43
  357. data/test/test_contentprocessor_haml.rb +0 -39
  358. data/test/test_contentprocessor_head.rb +0 -96
  359. data/test/test_contentprocessor_kramdown.rb +0 -56
  360. data/test/test_contentprocessor_less.rb +0 -40
  361. data/test/test_contentprocessor_maruku.rb +0 -33
  362. data/test/test_contentprocessor_rdiscount.rb +0 -21
  363. data/test/test_contentprocessor_rdoc.rb +0 -22
  364. data/test/test_contentprocessor_redcloth.rb +0 -26
  365. data/test/test_contentprocessor_sass.rb +0 -28
  366. data/test/test_contentprocessor_scss.rb +0 -28
  367. data/test/test_contentprocessor_tags.rb +0 -122
  368. data/test/test_contentprocessor_tidy.rb +0 -34
  369. data/test/test_contentprocessor_xmllint.rb +0 -38
  370. data/test/test_context.rb +0 -81
  371. data/test/test_error.rb +0 -93
  372. data/test/test_loggable.rb +0 -32
  373. data/test/test_logger.rb +0 -94
  374. data/test/test_node.rb +0 -469
  375. data/test/test_output_filesystem.rb +0 -60
  376. data/test/test_path.rb +0 -241
  377. data/test/test_source_filesystem.rb +0 -76
  378. data/test/test_source_resource.rb +0 -28
  379. data/test/test_source_stacked.rb +0 -49
  380. data/test/test_sourcehandler_base.rb +0 -136
  381. data/test/test_sourcehandler_copy.rb +0 -47
  382. data/test/test_sourcehandler_directory.rb +0 -38
  383. data/test/test_sourcehandler_feed.rb +0 -88
  384. data/test/test_sourcehandler_fragment.rb +0 -70
  385. data/test/test_sourcehandler_main.rb +0 -39
  386. data/test/test_sourcehandler_memory.rb +0 -44
  387. data/test/test_sourcehandler_metainfo.rb +0 -127
  388. data/test/test_sourcehandler_page.rb +0 -73
  389. data/test/test_sourcehandler_sitemap.rb +0 -68
  390. data/test/test_sourcehandler_template.rb +0 -68
  391. data/test/test_sourcehandler_virtual.rb +0 -106
  392. data/test/test_tag_base.rb +0 -62
  393. data/test/test_tag_breadcrumbtrail.rb +0 -91
  394. data/test/test_tag_coderay.rb +0 -45
  395. data/test/test_tag_date.rb +0 -18
  396. data/test/test_tag_executecommand.rb +0 -41
  397. data/test/test_tag_includefile.rb +0 -50
  398. data/test/test_tag_langbar.rb +0 -71
  399. data/test/test_tag_link.rb +0 -70
  400. data/test/test_tag_menu.rb +0 -207
  401. data/test/test_tag_metainfo.rb +0 -26
  402. data/test/test_tag_relocatable.rb +0 -60
  403. data/test/test_tag_sitemap.rb +0 -47
  404. data/test/test_tag_tikz.rb +0 -69
  405. data/test/test_tree.rb +0 -70
  406. data/test/test_website.rb +0 -130
  407. data/test/test_websiteaccess.rb +0 -25
  408. data/test/test_websitemanager.rb +0 -65
@@ -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")