thewoolleyman-webgen 0.5.8.20090419

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 (309) hide show
  1. data/AUTHORS +8 -0
  2. data/COPYING +10 -0
  3. data/GPL +340 -0
  4. data/Rakefile +334 -0
  5. data/THANKS +18 -0
  6. data/bin/webgen +12 -0
  7. data/data/webgen/resources.yaml +3 -0
  8. data/data/webgen/webgui/controller/main.rb +135 -0
  9. data/data/webgen/webgui/overrides/win32console.rb +0 -0
  10. data/data/webgen/webgui/public/css/jquery.autocomplete.css +50 -0
  11. data/data/webgen/webgui/public/css/ramaze_error.css +90 -0
  12. data/data/webgen/webgui/public/css/style.css +55 -0
  13. data/data/webgen/webgui/public/img/headerbg.jpg +0 -0
  14. data/data/webgen/webgui/public/img/webgen_logo.png +0 -0
  15. data/data/webgen/webgui/public/js/jquery.autocomplete.js +15 -0
  16. data/data/webgen/webgui/public/js/jquery.js +32 -0
  17. data/data/webgen/webgui/view/create_website.xhtml +22 -0
  18. data/data/webgen/webgui/view/error.xhtml +64 -0
  19. data/data/webgen/webgui/view/index.xhtml +22 -0
  20. data/data/webgen/webgui/view/manage_website.xhtml +18 -0
  21. data/data/webgen/webgui/view/page.xhtml +40 -0
  22. data/data/webgen/website_skeleton/README +10 -0
  23. data/data/webgen/website_skeleton/Rakefile +40 -0
  24. data/data/webgen/website_skeleton/config.yaml +17 -0
  25. data/data/webgen/website_skeleton/ext/init.rb +10 -0
  26. data/data/webgen/website_styles/1024px/README +13 -0
  27. data/data/webgen/website_styles/1024px/src/default.css +188 -0
  28. data/data/webgen/website_styles/1024px/src/default.template +60 -0
  29. data/data/webgen/website_styles/1024px/src/images/background.gif +0 -0
  30. data/data/webgen/website_styles/andreas00/README +13 -0
  31. data/data/webgen/website_styles/andreas00/src/default.css +290 -0
  32. data/data/webgen/website_styles/andreas00/src/default.template +60 -0
  33. data/data/webgen/website_styles/andreas00/src/images/bg.gif +0 -0
  34. data/data/webgen/website_styles/andreas00/src/images/front.jpg +0 -0
  35. data/data/webgen/website_styles/andreas00/src/images/menubg.gif +0 -0
  36. data/data/webgen/website_styles/andreas00/src/images/menubg2.gif +0 -0
  37. data/data/webgen/website_styles/andreas01/README +14 -0
  38. data/data/webgen/website_styles/andreas01/src/default.css +310 -0
  39. data/data/webgen/website_styles/andreas01/src/default.template +62 -0
  40. data/data/webgen/website_styles/andreas01/src/images/bg.gif +0 -0
  41. data/data/webgen/website_styles/andreas01/src/images/front.jpg +0 -0
  42. data/data/webgen/website_styles/andreas01/src/print.css +35 -0
  43. data/data/webgen/website_styles/andreas03/README +14 -0
  44. data/data/webgen/website_styles/andreas03/src/default.css +223 -0
  45. data/data/webgen/website_styles/andreas03/src/default.template +58 -0
  46. data/data/webgen/website_styles/andreas03/src/images/bodybg.png +0 -0
  47. data/data/webgen/website_styles/andreas03/src/images/contbg.png +0 -0
  48. data/data/webgen/website_styles/andreas03/src/images/footerbg.png +0 -0
  49. data/data/webgen/website_styles/andreas03/src/images/gradient1.png +0 -0
  50. data/data/webgen/website_styles/andreas03/src/images/gradient2.png +0 -0
  51. data/data/webgen/website_styles/andreas04/README +15 -0
  52. data/data/webgen/website_styles/andreas04/src/default.css +290 -0
  53. data/data/webgen/website_styles/andreas04/src/default.template +81 -0
  54. data/data/webgen/website_styles/andreas04/src/images/blinkarrow.gif +0 -0
  55. data/data/webgen/website_styles/andreas04/src/images/bodybg.png +0 -0
  56. data/data/webgen/website_styles/andreas04/src/images/contentbg.png +0 -0
  57. data/data/webgen/website_styles/andreas04/src/images/entrybg.png +0 -0
  58. data/data/webgen/website_styles/andreas04/src/images/flash.gif +0 -0
  59. data/data/webgen/website_styles/andreas04/src/images/flash2.gif +0 -0
  60. data/data/webgen/website_styles/andreas04/src/images/globe.gif +0 -0
  61. data/data/webgen/website_styles/andreas04/src/images/globebottom.gif +0 -0
  62. data/data/webgen/website_styles/andreas04/src/images/linkarrow.gif +0 -0
  63. data/data/webgen/website_styles/andreas04/src/images/menuhover.png +0 -0
  64. data/data/webgen/website_styles/andreas05/README +14 -0
  65. data/data/webgen/website_styles/andreas05/src/default.css +33 -0
  66. data/data/webgen/website_styles/andreas05/src/default.template +40 -0
  67. data/data/webgen/website_styles/andreas05/src/images/bodybg.gif +0 -0
  68. data/data/webgen/website_styles/andreas05/src/images/front.png +0 -0
  69. data/data/webgen/website_styles/andreas06/README +14 -0
  70. data/data/webgen/website_styles/andreas06/src/default.css +354 -0
  71. data/data/webgen/website_styles/andreas06/src/default.template +70 -0
  72. data/data/webgen/website_styles/andreas06/src/images/bodybg.gif +0 -0
  73. data/data/webgen/website_styles/andreas06/src/images/boxbg.gif +0 -0
  74. data/data/webgen/website_styles/andreas06/src/images/greypx.gif +0 -0
  75. data/data/webgen/website_styles/andreas06/src/images/header.jpg +0 -0
  76. data/data/webgen/website_styles/andreas06/src/images/innerbg.gif +0 -0
  77. data/data/webgen/website_styles/andreas06/src/images/leaves.jpg +0 -0
  78. data/data/webgen/website_styles/andreas06/src/images/tabs.gif +0 -0
  79. data/data/webgen/website_styles/andreas07/README +15 -0
  80. data/data/webgen/website_styles/andreas07/src/browserfix.css +7 -0
  81. data/data/webgen/website_styles/andreas07/src/default.css +92 -0
  82. data/data/webgen/website_styles/andreas07/src/default.template +42 -0
  83. data/data/webgen/website_styles/andreas07/src/images/bodybg.gif +0 -0
  84. data/data/webgen/website_styles/andreas07/src/images/sidebarbg.gif +0 -0
  85. data/data/webgen/website_styles/andreas08/README +14 -0
  86. data/data/webgen/website_styles/andreas08/src/default.css +224 -0
  87. data/data/webgen/website_styles/andreas08/src/default.template +51 -0
  88. data/data/webgen/website_styles/andreas09/README +14 -0
  89. data/data/webgen/website_styles/andreas09/src/default.css +308 -0
  90. data/data/webgen/website_styles/andreas09/src/default.template +68 -0
  91. data/data/webgen/website_styles/andreas09/src/images/bodybg-black.jpg +0 -0
  92. data/data/webgen/website_styles/andreas09/src/images/bodybg-green.jpg +0 -0
  93. data/data/webgen/website_styles/andreas09/src/images/bodybg-orange.jpg +0 -0
  94. data/data/webgen/website_styles/andreas09/src/images/bodybg-purple.jpg +0 -0
  95. data/data/webgen/website_styles/andreas09/src/images/bodybg-red.jpg +0 -0
  96. data/data/webgen/website_styles/andreas09/src/images/bodybg.jpg +0 -0
  97. data/data/webgen/website_styles/andreas09/src/images/footerbg.jpg +0 -0
  98. data/data/webgen/website_styles/andreas09/src/images/menuhover-black.jpg +0 -0
  99. data/data/webgen/website_styles/andreas09/src/images/menuhover-green.jpg +0 -0
  100. data/data/webgen/website_styles/andreas09/src/images/menuhover-orange.jpg +0 -0
  101. data/data/webgen/website_styles/andreas09/src/images/menuhover-purple.jpg +0 -0
  102. data/data/webgen/website_styles/andreas09/src/images/menuhover-red.jpg +0 -0
  103. data/data/webgen/website_styles/andreas09/src/images/menuhover.jpg +0 -0
  104. data/data/webgen/website_styles/simple/README +6 -0
  105. data/data/webgen/website_styles/simple/src/default.css +84 -0
  106. data/data/webgen/website_styles/simple/src/default.template +36 -0
  107. data/data/webgen/website_templates/default/README +6 -0
  108. data/data/webgen/website_templates/default/src/index.page +8 -0
  109. data/data/webgen/website_templates/project/README +5 -0
  110. data/data/webgen/website_templates/project/src/about.page +12 -0
  111. data/data/webgen/website_templates/project/src/download.page +15 -0
  112. data/data/webgen/website_templates/project/src/features.page +8 -0
  113. data/data/webgen/website_templates/project/src/index.page +9 -0
  114. data/data/webgen/website_templates/project/src/screenshots.page +18 -0
  115. data/doc/contentprocessor.template +11 -0
  116. data/doc/contentprocessor/blocks.page +129 -0
  117. data/doc/contentprocessor/builder.page +80 -0
  118. data/doc/contentprocessor/erb.page +59 -0
  119. data/doc/contentprocessor/erubis.page +46 -0
  120. data/doc/contentprocessor/fragments.page +25 -0
  121. data/doc/contentprocessor/haml.page +47 -0
  122. data/doc/contentprocessor/maruku.page +41 -0
  123. data/doc/contentprocessor/rdiscount.page +37 -0
  124. data/doc/contentprocessor/rdoc.page +36 -0
  125. data/doc/contentprocessor/redcloth.page +39 -0
  126. data/doc/contentprocessor/sass.page +31 -0
  127. data/doc/contentprocessor/tags.page +73 -0
  128. data/doc/extensions.metainfo +29 -0
  129. data/doc/extensions.page +16 -0
  130. data/doc/extensions.template +17 -0
  131. data/doc/faq.page +219 -0
  132. data/doc/getting_started.page +135 -0
  133. data/doc/index.page +65 -0
  134. data/doc/manual.page +589 -0
  135. data/doc/reference_configuration.page +959 -0
  136. data/doc/reference_metainfo.page +222 -0
  137. data/doc/source/filesystem.page +39 -0
  138. data/doc/source/tararchive.page +40 -0
  139. data/doc/sourcehandler.template +21 -0
  140. data/doc/sourcehandler/copy.page +19 -0
  141. data/doc/sourcehandler/directory.page +27 -0
  142. data/doc/sourcehandler/feed.page +105 -0
  143. data/doc/sourcehandler/metainfo.page +41 -0
  144. data/doc/sourcehandler/page.page +14 -0
  145. data/doc/sourcehandler/sitemap.page +46 -0
  146. data/doc/sourcehandler/template.page +45 -0
  147. data/doc/sourcehandler/virtual.page +49 -0
  148. data/doc/tag.template +25 -0
  149. data/doc/tag/breadcrumbtrail.page +40 -0
  150. data/doc/tag/coderay.page +49 -0
  151. data/doc/tag/date.page +31 -0
  152. data/doc/tag/executecommand.page +26 -0
  153. data/doc/tag/includefile.page +32 -0
  154. data/doc/tag/langbar.page +44 -0
  155. data/doc/tag/link.page +44 -0
  156. data/doc/tag/menu.page +106 -0
  157. data/doc/tag/metainfo.page +29 -0
  158. data/doc/tag/relocatable.page +38 -0
  159. data/doc/tag/sitemap.page +31 -0
  160. data/doc/tag/tikz.page +158 -0
  161. data/doc/upgrading.page +139 -0
  162. data/doc/webgen_page_format.page +129 -0
  163. data/lib/webgen/blackboard.rb +78 -0
  164. data/lib/webgen/cache.rb +87 -0
  165. data/lib/webgen/cli.rb +124 -0
  166. data/lib/webgen/cli/apply_command.rb +64 -0
  167. data/lib/webgen/cli/create_command.rb +66 -0
  168. data/lib/webgen/cli/run_command.rb +22 -0
  169. data/lib/webgen/cli/utils.rb +88 -0
  170. data/lib/webgen/cli/webgui_command.rb +72 -0
  171. data/lib/webgen/common.rb +21 -0
  172. data/lib/webgen/common/sitemap.rb +83 -0
  173. data/lib/webgen/configuration.rb +153 -0
  174. data/lib/webgen/contentprocessor.rb +99 -0
  175. data/lib/webgen/contentprocessor/blocks.rb +60 -0
  176. data/lib/webgen/contentprocessor/builder.rb +30 -0
  177. data/lib/webgen/contentprocessor/context.rb +89 -0
  178. data/lib/webgen/contentprocessor/erb.rb +28 -0
  179. data/lib/webgen/contentprocessor/erubis.rb +40 -0
  180. data/lib/webgen/contentprocessor/fragments.rb +25 -0
  181. data/lib/webgen/contentprocessor/haml.rb +30 -0
  182. data/lib/webgen/contentprocessor/maruku.rb +20 -0
  183. data/lib/webgen/contentprocessor/rdiscount.rb +17 -0
  184. data/lib/webgen/contentprocessor/rdoc.rb +19 -0
  185. data/lib/webgen/contentprocessor/redcloth.rb +17 -0
  186. data/lib/webgen/contentprocessor/sass.rb +20 -0
  187. data/lib/webgen/contentprocessor/tags.rb +136 -0
  188. data/lib/webgen/coreext.rb +13 -0
  189. data/lib/webgen/default_config.rb +215 -0
  190. data/lib/webgen/languages.rb +589 -0
  191. data/lib/webgen/loggable.rb +25 -0
  192. data/lib/webgen/logger.rb +97 -0
  193. data/lib/webgen/node.rb +391 -0
  194. data/lib/webgen/output.rb +82 -0
  195. data/lib/webgen/output/filesystem.rb +69 -0
  196. data/lib/webgen/page.rb +153 -0
  197. data/lib/webgen/path.rb +194 -0
  198. data/lib/webgen/source.rb +54 -0
  199. data/lib/webgen/source/filesystem.rb +61 -0
  200. data/lib/webgen/source/resource.rb +44 -0
  201. data/lib/webgen/source/stacked.rb +55 -0
  202. data/lib/webgen/source/tararchive.rb +73 -0
  203. data/lib/webgen/sourcehandler.rb +226 -0
  204. data/lib/webgen/sourcehandler/base.rb +248 -0
  205. data/lib/webgen/sourcehandler/copy.rb +43 -0
  206. data/lib/webgen/sourcehandler/directory.rb +36 -0
  207. data/lib/webgen/sourcehandler/feed.rb +117 -0
  208. data/lib/webgen/sourcehandler/fragment.rb +68 -0
  209. data/lib/webgen/sourcehandler/memory.rb +43 -0
  210. data/lib/webgen/sourcehandler/metainfo.rb +128 -0
  211. data/lib/webgen/sourcehandler/page.rb +59 -0
  212. data/lib/webgen/sourcehandler/sitemap.rb +60 -0
  213. data/lib/webgen/sourcehandler/template.rb +66 -0
  214. data/lib/webgen/sourcehandler/virtual.rb +110 -0
  215. data/lib/webgen/tag.rb +27 -0
  216. data/lib/webgen/tag/base.rb +170 -0
  217. data/lib/webgen/tag/breadcrumbtrail.rb +70 -0
  218. data/lib/webgen/tag/coderay.rb +31 -0
  219. data/lib/webgen/tag/date.rb +18 -0
  220. data/lib/webgen/tag/executecommand.rb +30 -0
  221. data/lib/webgen/tag/includefile.rb +42 -0
  222. data/lib/webgen/tag/langbar.rb +52 -0
  223. data/lib/webgen/tag/link.rb +26 -0
  224. data/lib/webgen/tag/menu.rb +207 -0
  225. data/lib/webgen/tag/metainfo.rb +25 -0
  226. data/lib/webgen/tag/relocatable.rb +54 -0
  227. data/lib/webgen/tag/sitemap.rb +41 -0
  228. data/lib/webgen/tag/tikz.rb +119 -0
  229. data/lib/webgen/tree.rb +90 -0
  230. data/lib/webgen/version.rb +8 -0
  231. data/lib/webgen/webgentask.rb +152 -0
  232. data/lib/webgen/website.rb +342 -0
  233. data/lib/webgen/websiteaccess.rb +31 -0
  234. data/lib/webgen/websitemanager.rb +127 -0
  235. data/man/man1/webgen.1 +73 -0
  236. data/misc/default.css +384 -0
  237. data/misc/default.template +75 -0
  238. data/misc/htmldoc.metainfo +25 -0
  239. data/misc/htmldoc.virtual +5 -0
  240. data/misc/images/arrow.gif +0 -0
  241. data/misc/images/error.png +0 -0
  242. data/misc/images/headerbg.jpg +0 -0
  243. data/misc/images/important.png +0 -0
  244. data/misc/images/information.png +0 -0
  245. data/misc/images/quote.gif +0 -0
  246. data/misc/images/warning.png +0 -0
  247. data/setup.rb +1585 -0
  248. data/test/helper.rb +45 -0
  249. data/test/test_blackboard.rb +60 -0
  250. data/test/test_cache.rb +59 -0
  251. data/test/test_cli.rb +21 -0
  252. data/test/test_common.rb +18 -0
  253. data/test/test_common_sitemap.rb +58 -0
  254. data/test/test_configuration.rb +68 -0
  255. data/test/test_contentprocessor.rb +33 -0
  256. data/test/test_contentprocessor_blocks.rb +68 -0
  257. data/test/test_contentprocessor_builder.rb +23 -0
  258. data/test/test_contentprocessor_context.rb +40 -0
  259. data/test/test_contentprocessor_erb.rb +23 -0
  260. data/test/test_contentprocessor_erubis.rb +49 -0
  261. data/test/test_contentprocessor_fragments.rb +42 -0
  262. data/test/test_contentprocessor_haml.rb +23 -0
  263. data/test/test_contentprocessor_maruku.rb +29 -0
  264. data/test/test_contentprocessor_rdiscount.rb +17 -0
  265. data/test/test_contentprocessor_rdoc.rb +18 -0
  266. data/test/test_contentprocessor_redcloth.rb +15 -0
  267. data/test/test_contentprocessor_sass.rb +22 -0
  268. data/test/test_contentprocessor_tags.rb +99 -0
  269. data/test/test_languages.rb +67 -0
  270. data/test/test_loggable.rb +32 -0
  271. data/test/test_logger.rb +94 -0
  272. data/test/test_node.rb +367 -0
  273. data/test/test_output_filesystem.rb +60 -0
  274. data/test/test_page.rb +214 -0
  275. data/test/test_path.rb +165 -0
  276. data/test/test_source_filesystem.rb +76 -0
  277. data/test/test_source_resource.rb +28 -0
  278. data/test/test_source_stacked.rb +36 -0
  279. data/test/test_source_tararchive.rb +65 -0
  280. data/test/test_sourcehandler_base.rb +123 -0
  281. data/test/test_sourcehandler_copy.rb +47 -0
  282. data/test/test_sourcehandler_directory.rb +42 -0
  283. data/test/test_sourcehandler_feed.rb +77 -0
  284. data/test/test_sourcehandler_fragment.rb +69 -0
  285. data/test/test_sourcehandler_memory.rb +44 -0
  286. data/test/test_sourcehandler_metainfo.rb +118 -0
  287. data/test/test_sourcehandler_page.rb +65 -0
  288. data/test/test_sourcehandler_sitemap.rb +49 -0
  289. data/test/test_sourcehandler_template.rb +65 -0
  290. data/test/test_sourcehandler_virtual.rb +87 -0
  291. data/test/test_tag_base.rb +85 -0
  292. data/test/test_tag_breadcrumbtrail.rb +91 -0
  293. data/test/test_tag_coderay.rb +32 -0
  294. data/test/test_tag_date.rb +18 -0
  295. data/test/test_tag_executecommand.rb +41 -0
  296. data/test/test_tag_includefile.rb +50 -0
  297. data/test/test_tag_langbar.rb +72 -0
  298. data/test/test_tag_link.rb +69 -0
  299. data/test/test_tag_menu.rb +207 -0
  300. data/test/test_tag_metainfo.rb +19 -0
  301. data/test/test_tag_relocatable.rb +59 -0
  302. data/test/test_tag_sitemap.rb +47 -0
  303. data/test/test_tag_tikz.rb +69 -0
  304. data/test/test_tree.rb +70 -0
  305. data/test/test_webgentask.rb +23 -0
  306. data/test/test_website.rb +98 -0
  307. data/test/test_websiteaccess.rb +25 -0
  308. data/test/test_websitemanager.rb +70 -0
  309. metadata +613 -0
@@ -0,0 +1,66 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/cli'
4
+ require 'webgen/websitemanager'
5
+
6
+ module Webgen::CLI
7
+
8
+ # The CLI command for creating a webgen website.
9
+ class CreateCommand < CmdParse::Command
10
+
11
+ def initialize #:nodoc:
12
+ super('create', false)
13
+ self.description = Utils.format("If the verbosity level is set to verbose, the created files are listed.")
14
+ @template = 'default'
15
+ @style = 'andreas07'
16
+
17
+ self.short_desc = 'Create a basic webgen website with selectable template/style'
18
+ self.options = CmdParse::OptionParserWrapper.new do |opts|
19
+ opts.separator "Options:"
20
+ opts.on('-t', '--template TEMPLATE', String, 'A website template or "none" (default: default)') do |val|
21
+ @template = (val == 'none' ? nil : val)
22
+ end
23
+ opts.on('-s', '--style STYLE', String, 'A website style or "none" (default: andreas07)') do |val|
24
+ @style = (val == 'none' ? nil : val)
25
+ end
26
+ opts.separator ""
27
+ opts.separator "Arguments:"
28
+ opts.separator opts.summary_indent + "DIR: the directory in which the website should be created"
29
+ end
30
+ end
31
+
32
+ def usage # :nodoc:
33
+ "Usage: #{commandparser.program_name} [global options] create [options] DIR"
34
+ end
35
+
36
+ def show_help # :nodoc:
37
+ super
38
+ wm = Webgen::WebsiteManager.new(commandparser.directory)
39
+
40
+ puts
41
+ puts "Available templates and styles:"
42
+ puts Utils.headline('Templates')
43
+ wm.templates.sort.each {|name, entry| Utils.hash_output(name, entry.instance_eval { @table }) }
44
+ puts Utils.headline('Styles')
45
+ wm.styles.select {|k,v| k =~ /^website-|[^-]+/ }.sort.each {|name, entry| Utils.hash_output(name, entry.instance_eval { @table }) }
46
+ end
47
+
48
+ # Create a webgen website in the directory <tt>args[0]</tt>.
49
+ def execute(args)
50
+ if args.length == 0
51
+ raise OptionParser::MissingArgument.new('DIR')
52
+ else
53
+ wm = Webgen::WebsiteManager.new(args[0])
54
+ paths = wm.create_website
55
+ paths += wm.apply_template(@template) if @template
56
+ paths += wm.apply_style(@style) if @style
57
+ if commandparser.verbosity == :verbose
58
+ puts "The following files were created in the directory #{args[0]}:"
59
+ puts paths.sort.collect {|f| "- " + f }.join("\n")
60
+ end
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,22 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/cli'
4
+
5
+ module Webgen::CLI
6
+
7
+ # The CLI command for rendering a webgen website.
8
+ class RunCommand < CmdParse::Command
9
+
10
+ def initialize # :nodoc:
11
+ super('render', false)
12
+ self.short_desc = 'Render the webgen website'
13
+ end
14
+
15
+ # Render the website.
16
+ def execute(args)
17
+ commandparser.create_website.render
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -0,0 +1,88 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'facets/ansicode'
4
+ require 'rbconfig'
5
+
6
+ ANSICode.define_ansicolor_method(:lred, '1;31')
7
+ ANSICode.define_ansicolor_method(:lblue, '1;34')
8
+
9
+ module Webgen::CLI
10
+
11
+ # Provides methods for other CLI classes for formatting text in a consistent manner.
12
+ class Utils
13
+
14
+ USE_ANSI_COLORS = !Config::CONFIG['arch'].include?('mswin32')
15
+ DEFAULT_WIDTH = if Config::CONFIG['arch'].include?('mswin32')
16
+ 72
17
+ else
18
+ ((size = %x{stty size 2>/dev/null}).length > 0 ? size.split.last.to_i : 72) rescue 72
19
+ end
20
+
21
+ # Used for dynamically formatting the text (setting color, bold face, ...).
22
+ def self.method_missing(id, text = nil)
23
+ if USE_ANSI_COLORS && ANSICode.respond_to?(id)
24
+ ANSICode.send(id, text.to_s)
25
+ else
26
+ text.to_s
27
+ end
28
+ end
29
+
30
+ # Return an array of lines which represents the text in +content+ formatted sothat no line is
31
+ # longer than +width+ characters. The +indent+ parameter specifies the amount of spaces
32
+ # prepended to each line. If +first_line_indented+ is +true+, then the first line is indented.
33
+ def self.format(content, indent = 0, first_line_indented = false, width = DEFAULT_WIDTH)
34
+ content = (content || '').dup
35
+ length = width - indent
36
+
37
+ paragraphs = content.split(/\n\n/)
38
+ if (0..1) === paragraphs.length
39
+ pattern = /^(.{0,#{length}})[ \n]/m
40
+ lines = []
41
+ while content.length > length
42
+ if content =~ pattern
43
+ str = $1
44
+ len = $&.length
45
+ else
46
+ str = content[0, length]
47
+ len = length
48
+ end
49
+ lines << (lines.empty? && !first_line_indented ? '' : ' '*indent) + str.gsub(/\n/, ' ')
50
+ content.slice!(0, len)
51
+ end
52
+ lines << (lines.empty? && !first_line_indented ? '' : ' '*indent) + content.gsub(/\n/, ' ') unless content.strip.empty?
53
+ lines
54
+ else
55
+ ((format(paragraphs.shift, indent, first_line_indented, width) << '') +
56
+ paragraphs.collect {|p| format(p, indent, true, width) << '' }).flatten[0..-2]
57
+ end
58
+ end
59
+
60
+ # Return a headline with the given +text+ and amount of +indent+.
61
+ def self.headline(text, indent = 2)
62
+ ' '*indent + "#{bold(text)}"
63
+ end
64
+
65
+ # Return a section header with the given +text+ formatted in the given +color+ and indented
66
+ # according to +indent+. The whole text is also left justified to the column specified with
67
+ # +ljustlength+.
68
+ def self.section(text, ljustlength = 0, indent = 4, color = :green)
69
+ ' '*indent + "#{send(color, text)}".ljust(ljustlength - indent + send(color).length)
70
+ end
71
+
72
+ # Creates a listing of the key-value pairs of +hash+ under a section called +name+.
73
+ def self.hash_output(name, hash)
74
+ ljust = 20
75
+ puts section('Name', ljust) + "#{lred(name)}"
76
+
77
+ hash.sort_by {|k,v| k.to_s }.each do |name, value|
78
+ next unless value.respond_to?(:to_str)
79
+ desc = format(value.to_str, ljust)
80
+ puts section(name.to_s.capitalize, ljust) + desc.shift
81
+ desc.each {|line| puts line}
82
+ end
83
+ puts
84
+ end
85
+
86
+ end
87
+
88
+ end
@@ -0,0 +1,72 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/cli'
4
+ require 'facets/kernel/silence'
5
+
6
+ # nothing to see here
7
+ module Ramaze # :nodoc:
8
+ end
9
+
10
+ module Webgen::CLI
11
+
12
+ # The CLI command for starting the webgen webgui.
13
+ class WebguiCommand < CmdParse::Command
14
+
15
+ def initialize # :nodoc:
16
+ super('webgui', false)
17
+ self.short_desc = 'Starts the webgen webgui'
18
+ end
19
+
20
+ # Render the website.
21
+ def execute(args)
22
+ # some fixes for ramaze-2009.02
23
+ # - fix for Windows when win32console is not installed
24
+ # - fix for message displayed on shutdown
25
+ # - fix for warning message
26
+ $:.unshift File.join(Webgen.data_dir, 'webgui', 'overrides')
27
+ require 'win32console'
28
+ $:.shift
29
+ silence_warnings do
30
+ begin
31
+ require 'ramaze'
32
+ rescue LoadError
33
+ puts "The Ramaze web framework which is needed for the webgui was not found."
34
+ puts "You can install it via 'gem install ramaze --version 2009.02'"
35
+ return
36
+ end
37
+ end
38
+ def Ramaze.shutdown; # :nodoc:
39
+ end
40
+
41
+ Ramaze::acquire(File.join(Webgen.data_dir, 'webgui', 'controller', '*'))
42
+ Ramaze::Log.loggers = []
43
+ Ramaze::Global.setup do |g|
44
+ g.root = File.join(Webgen.data_dir, 'webgui')
45
+ g.public_root = File.join(Webgen.data_dir, 'webgui', 'public')
46
+ g.view_root = File.join(Webgen.data_dir, 'webgui', 'view')
47
+ g.adapter = :webrick
48
+ g.port = 7000
49
+ end
50
+
51
+ puts 'Starting webgui on http://localhost:7000, press Control-C to stop'
52
+
53
+ Thread.new do
54
+ begin
55
+ require 'launchy'
56
+ sleep 2
57
+ puts 'Launching web browser'
58
+ Launchy.open('http://localhost:7000')
59
+ rescue LoadError
60
+ puts "Can't open browser because the launchy library was not found."
61
+ puts "You can install it via 'gem install launchy'"
62
+ puts "Please open a browser window and enter 'http://localhost:7000' into the address bar!"
63
+ end
64
+ end
65
+
66
+ Ramaze.start
67
+ puts 'webgui finished'
68
+ end
69
+
70
+ end
71
+
72
+ end
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'pathname'
4
+
5
+ module Webgen
6
+
7
+ # Namespace for classes and methods that provide common functionality.
8
+ module Common
9
+
10
+ autoload :Sitemap, 'webgen/common/sitemap'
11
+
12
+ # Make the given +path+ absolute by prepending the absolute path +base+ if necessary. Also
13
+ # resolves all '..' and '.' references in +path+.
14
+ def self.absolute_path(path, base)
15
+ raise(ArgumentError, 'base has to be an absolute path') unless base =~ /\//
16
+ Pathname.new(path =~ /^\// ? path : File.join(base, path)).cleanpath.to_s
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,83 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'webgen/tag'
4
+ require 'webgen/websiteaccess'
5
+
6
+ module Webgen::Common
7
+
8
+ # This class provides functionality for creating sitemaps and checking if a sitemap has changed.
9
+ class Sitemap
10
+
11
+ include Webgen::WebsiteAccess
12
+
13
+ def initialize #:nodoc:
14
+ website.blackboard.add_listener(:node_changed?, method(:node_changed?))
15
+ end
16
+
17
+ # Return the sitemap tree as Webgen::Tag::Menu::MenuNode created for the +node+ in the language
18
+ # +lang+ using the provided +options+ which can be any configuration option starting with
19
+ # <tt>common.sitemap</tt>.
20
+ def create_sitemap(node, lang, options)
21
+ @options = options
22
+ tree = recursive_create(nil, node.tree.root, lang).sort!
23
+ @options = nil
24
+ (node.node_info[:common_sitemap] ||= {})[[options.to_a.sort, lang]] = tree.to_lcn_list
25
+ tree
26
+ end
27
+
28
+ #######
29
+ private
30
+ #######
31
+
32
+ # Recursively create the sitemap.
33
+ def recursive_create(parent, node, lang, in_sitemap = true)
34
+ mnode = Webgen::Tag::Menu::MenuNode.new(parent, node)
35
+ node.children.map do |n|
36
+ sub_in_sitemap = in_sitemap?(n, lang)
37
+ [(!n.children.empty? || sub_in_sitemap ? n : nil), sub_in_sitemap]
38
+ end.each do |n, sub_in_sitemap|
39
+ next if n.nil?
40
+ sub_node = recursive_create(mnode, n, lang, sub_in_sitemap)
41
+ mnode.children << sub_node unless sub_node.nil?
42
+ end
43
+ (mnode.children.empty? && !in_sitemap ? nil : mnode)
44
+ end
45
+
46
+ # Return +true+ if the +child+ of the +node+ is in the sitemap for the language +lang+.
47
+ def in_sitemap?(child, lang, allow_index_file = false)
48
+ ((option('common.sitemap.used_kinds').empty? || option('common.sitemap.used_kinds').include?(child['kind']) ||
49
+ (child.routing_node(lang, false) != child && in_sitemap?(child.routing_node(lang), lang, true))) &&
50
+ (option('common.sitemap.any_lang') || child.lang.nil? || child.lang == lang) &&
51
+ (!option('common.sitemap.honor_in_menu') || child['in_menu']) &&
52
+ (allow_index_file || child.parent == child.tree.root || child.parent.routing_node(lang) != child))
53
+ end
54
+
55
+ # Retrieve the configuration option value for +name+. The value is taken from the current
56
+ # configuration options hash if +name+ is specified there or from the website configuration
57
+ # otherwise.
58
+ def option(name)
59
+ (@options && @options.has_key?(name) ? @options[name] : website.config[name])
60
+ end
61
+
62
+ # Check if the sitemaps for +node+ have changed.
63
+ def node_changed?(node)
64
+ return if !node.node_info[:common_sitemap]
65
+
66
+ node.node_info[:common_sitemap].each do |(options, lang), cached_tree|
67
+ @options = options.to_hash
68
+ tree = recursive_create(nil, node.tree.root, lang).sort!.to_lcn_list
69
+ @options = nil
70
+
71
+ if (tree != cached_tree) ||
72
+ (tree.flatten.any? do |alcn|
73
+ (n = node.tree[alcn]) && (r = n.routing_node(lang)) && r.meta_info_changed?
74
+ end)
75
+ node.flag(:dirty)
76
+ break
77
+ end
78
+ end
79
+ end
80
+
81
+ end
82
+
83
+ end
@@ -0,0 +1,153 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'facets/symbol/to_proc'
4
+
5
+ module Webgen
6
+
7
+ # Stores the configuration for a webgen website.
8
+ #
9
+ # Configuration options should be created like this:
10
+ #
11
+ # config.my.new.config 'value', :doc => 'some', :meta => 'info'
12
+ #
13
+ # and later accessed or set using the accessor methods #[] and #[]= or a configuration helper.
14
+ # These helpers are defined in the Helpers module and provide easier access to complex
15
+ # configuration options. Also see the {webgen
16
+ # manual}[http://webgen.rubyforge.org/documentation/manual.html#website-configfile] for
17
+ # information about the configuration helpers.
18
+ class Configuration
19
+
20
+ # Helper class for providing an easy method to define configuration options.
21
+ class MethodChain
22
+
23
+ def initialize(config) #:nodoc:
24
+ @config = config
25
+ @name = ''
26
+ end
27
+
28
+ def method_missing(id, *args) #:nodoc:
29
+ @name += (@name.empty? ? '' : '.') + id.id2name.sub(/(!|=)$/,'')
30
+ if args.length > 0
31
+ value = args.shift
32
+ @config.data[@name] = value unless @config.data.has_key?(@name) # value is set only the first time
33
+ @config.meta_info[@name] ||= {}
34
+ @config.meta_info[@name].update(*args) if args.length > 0
35
+ nil
36
+ else
37
+ self
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ # This module provides methods for setting more complex configuration options. It is mixed into
44
+ # Webgen::Configuration so that its methods can be used. Detailed information on the use of the
45
+ # methods can be found in the "User Manual" in the "Configuration File" section.
46
+ #
47
+ # All public methods defined in this module are available for direct use in the
48
+ # configuration file, e.g. the method named +default_meta_info+ can be used like this:
49
+ #
50
+ # default_meta_info:
51
+ # Webgen::SourceHandler::Page:
52
+ # in_menu : true
53
+ # :action : replace
54
+ #
55
+ # All methods have to take exactly one argument, a Hash.
56
+ #
57
+ # The special key <tt>:action</tt> should be used for specifying how the configuration option
58
+ # should be set:
59
+ #
60
+ # [replace] Replace the configuration option with the new values.
61
+ # [modify] Replace old values with new values and add missing ones (useful for hashes and
62
+ # normally the default value)
63
+ module Helpers
64
+
65
+ # Set the default meta information for source handlers.
66
+ def default_meta_info(args)
67
+ args.each do |sh_name, mi|
68
+ raise ArgumentError, 'Invalid argument for configuration helper default_meta_info' unless mi.kind_of?(Hash)
69
+ action = mi.delete(:action) || 'modify'
70
+ mi_hash = (self['sourcehandler.default_meta_info'][complete_source_handler_name(sh_name)] ||= {})
71
+ case action
72
+ when 'replace' then mi_hash.replace(mi)
73
+ else mi_hash.update(mi)
74
+ end
75
+ end
76
+ end
77
+
78
+
79
+ # Set the path patterns used by source handlers.
80
+ def patterns(args)
81
+ args.each do |sh_name, data|
82
+ pattern_arr = (self['sourcehandler.patterns'][complete_source_handler_name(sh_name)] ||= [])
83
+ case data
84
+ when Array then pattern_arr.replace(data)
85
+ when Hash
86
+ (data['del'] || []).each {|pat| pattern_arr.delete(pat)}
87
+ (data['add'] || []).each {|pat| pattern_arr << pat}
88
+ else
89
+ raise ArgumentError, 'Invalid argument for configuration helper patterns'
90
+ end
91
+ end
92
+ end
93
+
94
+
95
+ # Set the default processing pipeline for a source handler.
96
+ def default_processing_pipeline(args)
97
+ args.each do |sh_name, pipeline|
98
+ raise ArgumentError, 'Invalid argument for configuration helper pipeline' unless pipeline.kind_of?(String)
99
+ mi_hash = (self['sourcehandler.default_meta_info'][complete_source_handler_name(sh_name)] ||= {})
100
+ ((mi_hash['blocks'] ||= {})['default'] ||= {})['pipeline'] = pipeline
101
+ end
102
+ end
103
+
104
+
105
+ # Complete +sh_name+ by checking if a source handler called
106
+ # <tt>Webgen::SourceHandler::SH_NAME</tt> exists.
107
+ def complete_source_handler_name(sh_name)
108
+ (Webgen::SourceHandler.constants.map(&:to_s).include?(sh_name) ? 'Webgen::SourceHandler::' + sh_name : sh_name)
109
+ end
110
+ private :complete_source_handler_name
111
+
112
+ end
113
+
114
+
115
+ include Helpers
116
+
117
+ # The hash which stores the meta info for the configuration options.
118
+ attr_reader :meta_info
119
+
120
+ # The configuration options hash.
121
+ attr_reader :data
122
+
123
+ # Create a new Configuration object.
124
+ def initialize
125
+ @data = {}
126
+ @meta_info = {}
127
+ end
128
+
129
+ # Return the configuration option +name+.
130
+ def [](name)
131
+ if @data.has_key?(name)
132
+ @data[name]
133
+ else
134
+ raise ArgumentError, "No such configuration option: #{name}"
135
+ end
136
+ end
137
+
138
+ # Set the configuration option +name+ to the provided +value+.
139
+ def []=(name, value)
140
+ if @data.has_key?(name)
141
+ @data[name] = value
142
+ else
143
+ raise ArgumentError, "No such configuration option: #{name}"
144
+ end
145
+ end
146
+
147
+ def method_missing(id, *args) #:nodoc:
148
+ MethodChain.new(self).method_missing(id, *args)
149
+ end
150
+
151
+ end
152
+
153
+ end