gettalong-webgen 0.5.4.20080929

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 (290) hide show
  1. data/AUTHORS +5 -0
  2. data/COPYING +10 -0
  3. data/GPL +340 -0
  4. data/Rakefile +324 -0
  5. data/THANKS +17 -0
  6. data/bin/webgen +10 -0
  7. data/data/webgen/resources.yaml +3 -0
  8. data/data/webgen/webgui/controller/main.rb +129 -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 +6 -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 +61 -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 +66 -0
  117. data/doc/contentprocessor/builder.page +80 -0
  118. data/doc/contentprocessor/erb.page +56 -0
  119. data/doc/contentprocessor/erubis.page +46 -0
  120. data/doc/contentprocessor/haml.page +47 -0
  121. data/doc/contentprocessor/maruku.page +41 -0
  122. data/doc/contentprocessor/rdiscount.page +37 -0
  123. data/doc/contentprocessor/rdoc.page +36 -0
  124. data/doc/contentprocessor/redcloth.page +39 -0
  125. data/doc/contentprocessor/sass.page +31 -0
  126. data/doc/contentprocessor/tags.page +73 -0
  127. data/doc/extensions.metainfo +29 -0
  128. data/doc/extensions.page +16 -0
  129. data/doc/extensions.template +17 -0
  130. data/doc/faq.page +214 -0
  131. data/doc/getting_started.page +134 -0
  132. data/doc/index.page +65 -0
  133. data/doc/manual.page +532 -0
  134. data/doc/reference_configuration.page +646 -0
  135. data/doc/reference_metainfo.page +213 -0
  136. data/doc/sourcehandler.template +21 -0
  137. data/doc/sourcehandler/copy.page +19 -0
  138. data/doc/sourcehandler/directory.page +27 -0
  139. data/doc/sourcehandler/feed.page +82 -0
  140. data/doc/sourcehandler/metainfo.page +41 -0
  141. data/doc/sourcehandler/page.page +30 -0
  142. data/doc/sourcehandler/sitemap.page +46 -0
  143. data/doc/sourcehandler/template.page +45 -0
  144. data/doc/sourcehandler/virtual.page +49 -0
  145. data/doc/tag.template +25 -0
  146. data/doc/tag/breadcrumbtrail.page +40 -0
  147. data/doc/tag/coderay.page +49 -0
  148. data/doc/tag/date.page +31 -0
  149. data/doc/tag/executecommand.page +26 -0
  150. data/doc/tag/includefile.page +32 -0
  151. data/doc/tag/langbar.page +22 -0
  152. data/doc/tag/menu.page +92 -0
  153. data/doc/tag/metainfo.page +29 -0
  154. data/doc/tag/relocatable.page +38 -0
  155. data/doc/tag/sitemap.page +31 -0
  156. data/doc/upgrading.page +139 -0
  157. data/doc/webgen_page_format.page +128 -0
  158. data/lib/webgen/blackboard.rb +73 -0
  159. data/lib/webgen/cache.rb +85 -0
  160. data/lib/webgen/cli.rb +118 -0
  161. data/lib/webgen/cli/create_command.rb +64 -0
  162. data/lib/webgen/cli/run_command.rb +20 -0
  163. data/lib/webgen/cli/utils.rb +86 -0
  164. data/lib/webgen/cli/webgui_command.rb +49 -0
  165. data/lib/webgen/common.rb +10 -0
  166. data/lib/webgen/common/sitemap.rb +76 -0
  167. data/lib/webgen/configuration.rb +147 -0
  168. data/lib/webgen/contentprocessor.rb +96 -0
  169. data/lib/webgen/contentprocessor/blocks.rb +46 -0
  170. data/lib/webgen/contentprocessor/builder.rb +26 -0
  171. data/lib/webgen/contentprocessor/context.rb +90 -0
  172. data/lib/webgen/contentprocessor/erb.rb +24 -0
  173. data/lib/webgen/contentprocessor/erubis.rb +40 -0
  174. data/lib/webgen/contentprocessor/haml.rb +25 -0
  175. data/lib/webgen/contentprocessor/maruku.rb +18 -0
  176. data/lib/webgen/contentprocessor/rdiscount.rb +15 -0
  177. data/lib/webgen/contentprocessor/rdoc.rb +17 -0
  178. data/lib/webgen/contentprocessor/redcloth.rb +15 -0
  179. data/lib/webgen/contentprocessor/sass.rb +18 -0
  180. data/lib/webgen/contentprocessor/tags.rb +134 -0
  181. data/lib/webgen/coreext.rb +10 -0
  182. data/lib/webgen/default_config.rb +198 -0
  183. data/lib/webgen/languages.rb +578 -0
  184. data/lib/webgen/loggable.rb +23 -0
  185. data/lib/webgen/logger.rb +78 -0
  186. data/lib/webgen/node.rb +347 -0
  187. data/lib/webgen/output.rb +37 -0
  188. data/lib/webgen/output/filesystem.rb +67 -0
  189. data/lib/webgen/page.rb +133 -0
  190. data/lib/webgen/path.rb +182 -0
  191. data/lib/webgen/source.rb +24 -0
  192. data/lib/webgen/source/filesystem.rb +58 -0
  193. data/lib/webgen/source/resource.rb +42 -0
  194. data/lib/webgen/source/stacked.rb +53 -0
  195. data/lib/webgen/sourcehandler.rb +202 -0
  196. data/lib/webgen/sourcehandler/base.rb +211 -0
  197. data/lib/webgen/sourcehandler/copy.rb +41 -0
  198. data/lib/webgen/sourcehandler/directory.rb +31 -0
  199. data/lib/webgen/sourcehandler/feed.rb +121 -0
  200. data/lib/webgen/sourcehandler/fragment.rb +71 -0
  201. data/lib/webgen/sourcehandler/metainfo.rb +117 -0
  202. data/lib/webgen/sourcehandler/page.rb +77 -0
  203. data/lib/webgen/sourcehandler/sitemap.rb +60 -0
  204. data/lib/webgen/sourcehandler/template.rb +68 -0
  205. data/lib/webgen/sourcehandler/virtual.rb +75 -0
  206. data/lib/webgen/tag.rb +23 -0
  207. data/lib/webgen/tag/base.rb +162 -0
  208. data/lib/webgen/tag/breadcrumbtrail.rb +71 -0
  209. data/lib/webgen/tag/coderay.rb +32 -0
  210. data/lib/webgen/tag/date.rb +18 -0
  211. data/lib/webgen/tag/executecommand.rb +29 -0
  212. data/lib/webgen/tag/includefile.rb +42 -0
  213. data/lib/webgen/tag/langbar.rb +52 -0
  214. data/lib/webgen/tag/menu.rb +186 -0
  215. data/lib/webgen/tag/metainfo.rb +25 -0
  216. data/lib/webgen/tag/relocatable.rb +53 -0
  217. data/lib/webgen/tag/sitemap.rb +42 -0
  218. data/lib/webgen/tree.rb +80 -0
  219. data/lib/webgen/version.rb +6 -0
  220. data/lib/webgen/webgentask.rb +148 -0
  221. data/lib/webgen/website.rb +214 -0
  222. data/lib/webgen/websiteaccess.rb +29 -0
  223. data/lib/webgen/websitemanager.rb +125 -0
  224. data/man/man1/webgen.1 +67 -0
  225. data/misc/default.css +360 -0
  226. data/misc/default.template +75 -0
  227. data/misc/htmldoc.metainfo +25 -0
  228. data/misc/htmldoc.virtual +5 -0
  229. data/misc/images/arrow.gif +0 -0
  230. data/misc/images/error.gif +0 -0
  231. data/misc/images/exclamation.gif +0 -0
  232. data/misc/images/headerbg.jpg +0 -0
  233. data/misc/images/information.gif +0 -0
  234. data/misc/images/quote.gif +0 -0
  235. data/setup.rb +1585 -0
  236. data/test/helper.rb +41 -0
  237. data/test/test_blackboard.rb +58 -0
  238. data/test/test_cache.rb +57 -0
  239. data/test/test_common_sitemap.rb +56 -0
  240. data/test/test_configuration.rb +66 -0
  241. data/test/test_contentprocessor.rb +31 -0
  242. data/test/test_contentprocessor_blocks.rb +34 -0
  243. data/test/test_contentprocessor_builder.rb +19 -0
  244. data/test/test_contentprocessor_context.rb +38 -0
  245. data/test/test_contentprocessor_erb.rb +20 -0
  246. data/test/test_contentprocessor_erubis.rb +47 -0
  247. data/test/test_contentprocessor_haml.rb +20 -0
  248. data/test/test_contentprocessor_maruku.rb +27 -0
  249. data/test/test_contentprocessor_rdiscount.rb +15 -0
  250. data/test/test_contentprocessor_rdoc.rb +16 -0
  251. data/test/test_contentprocessor_redcloth.rb +12 -0
  252. data/test/test_contentprocessor_sass.rb +20 -0
  253. data/test/test_contentprocessor_tags.rb +97 -0
  254. data/test/test_languages.rb +53 -0
  255. data/test/test_loggable.rb +30 -0
  256. data/test/test_logger.rb +73 -0
  257. data/test/test_node.rb +339 -0
  258. data/test/test_output_filesystem.rb +58 -0
  259. data/test/test_page.rb +203 -0
  260. data/test/test_path.rb +131 -0
  261. data/test/test_source_filesystem.rb +59 -0
  262. data/test/test_source_resource.rb +26 -0
  263. data/test/test_source_stacked.rb +34 -0
  264. data/test/test_sourcehandler_base.rb +92 -0
  265. data/test/test_sourcehandler_copy.rb +45 -0
  266. data/test/test_sourcehandler_directory.rb +25 -0
  267. data/test/test_sourcehandler_feed.rb +74 -0
  268. data/test/test_sourcehandler_fragment.rb +67 -0
  269. data/test/test_sourcehandler_metainfo.rb +93 -0
  270. data/test/test_sourcehandler_page.rb +70 -0
  271. data/test/test_sourcehandler_sitemap.rb +47 -0
  272. data/test/test_sourcehandler_template.rb +63 -0
  273. data/test/test_sourcehandler_virtual.rb +56 -0
  274. data/test/test_tag_base.rb +82 -0
  275. data/test/test_tag_breadcrumbtrail.rb +89 -0
  276. data/test/test_tag_coderay.rb +30 -0
  277. data/test/test_tag_date.rb +16 -0
  278. data/test/test_tag_executecommand.rb +39 -0
  279. data/test/test_tag_includefile.rb +48 -0
  280. data/test/test_tag_langbar.rb +60 -0
  281. data/test/test_tag_menu.rb +195 -0
  282. data/test/test_tag_metainfo.rb +17 -0
  283. data/test/test_tag_relocatable.rb +57 -0
  284. data/test/test_tag_sitemap.rb +44 -0
  285. data/test/test_tree.rb +69 -0
  286. data/test/test_webgentask.rb +21 -0
  287. data/test/test_website.rb +96 -0
  288. data/test/test_websiteaccess.rb +23 -0
  289. data/test/test_websitemanager.rb +68 -0
  290. metadata +575 -0
@@ -0,0 +1,42 @@
1
+ require 'webgen/websiteaccess'
2
+ require 'webgen/tag'
3
+
4
+ module Webgen::Tag
5
+
6
+ # Generates a sitemap. The sitemap contains the hierarchy of all pages on the web site.
7
+ class Sitemap
8
+
9
+ include Base
10
+ include Webgen::WebsiteAccess
11
+
12
+ # Create the sitemap.
13
+ def call(tag, body, context)
14
+ tree = website.blackboard.invoke(:create_sitemap, context.dest_node, context.content_node.lang, @params)
15
+ (tree.children.empty? ? '' : output_sitemap(tree, context))
16
+ end
17
+
18
+ #######
19
+ private
20
+ #######
21
+
22
+ # The modified tag base to support the easy specification of common.sitemap.* options.
23
+ def tag_config_base
24
+ 'common.sitemap'
25
+ end
26
+
27
+ # Create the HTML representation of the sitemap nodes in +tree+ in respect to +context+.
28
+ def output_sitemap(tree, context)
29
+ out = "<ul>"
30
+ tree.children.each do |child|
31
+ sub = (child.children.length > 0 ? output_sitemap(child, context) : '')
32
+ out << "<li>" + context.dest_node.link_to(child.node, :lang => child.node.lang || context.content_node.lang)
33
+ out << sub
34
+ out << "</li>"
35
+ end
36
+ out << "</ul>"
37
+ out
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,80 @@
1
+ require 'webgen/websiteaccess'
2
+ require 'webgen/node'
3
+
4
+ module Webgen
5
+
6
+ # Represents a tree of nodes.
7
+ class Tree
8
+
9
+ include WebsiteAccess
10
+
11
+ # The dummy root. This is the default node that gets created when the Tree is created sothat the
12
+ # real root node can be treated like any other node. It has only one child, namely the real root
13
+ # node of the tree.
14
+ attr_reader :dummy_root
15
+
16
+ # Direct access to the hashes for node resolving. Only use this for reading purposes! If you
17
+ # just want to get a specific node for an alcn/acn/output path, use #node instead.
18
+ attr_reader :node_access
19
+
20
+ # The hash containing processing information for each node. This is normally not accessed
21
+ # directly but via the Node#node_info method.
22
+ attr_reader :node_info
23
+
24
+ # Create a new Tree object.
25
+ def initialize
26
+ @node_access = {:alcn => {}, :acn => {}, :path => {}}
27
+ @node_info = {}
28
+ @dummy_root = Node.new(self, '', '')
29
+ end
30
+
31
+ # The real root node of the tree.
32
+ def root
33
+ @dummy_root.children.first
34
+ end
35
+
36
+ # Access a node via a +path+ of a specific +type+. If type is +alcn+ then +path+ has to be an
37
+ # absolute localized canonical name, if type is +acn+ then +path+ has to be an absolute
38
+ # canonical name and if type is +path+ then +path+ needs to be an output path.
39
+ #
40
+ # Returns the requested Node or +nil+ if such a node does not exist.
41
+ def node(path, type = :alcn)
42
+ (type == :acn ? @node_access[type][path] && @node_access[type][path].first : @node_access[type][path])
43
+ end
44
+ alias_method :[], :node
45
+
46
+ # A utility method called by Node#initialize. This method should not be used directly!
47
+ def register_node(node)
48
+ if @node_access[:alcn].has_key?(node.absolute_lcn)
49
+ raise "Can't have two nodes with same absolute lcn: #{node.absolute_lcn}"
50
+ else
51
+ @node_access[:alcn][node.absolute_lcn] = node
52
+ end
53
+ (@node_access[:acn][node.absolute_cn] ||= []) << node
54
+ if @node_access[:path].has_key?(node.path)
55
+ raise "Can't have two nodes with same output path: #{node.path}" unless node['no_output']
56
+ else
57
+ @node_access[:path][node.path] = node
58
+ end
59
+ end
60
+
61
+ # Delete the node identified by +node_or_alcn+ and all of its children from the
62
+ # tree. Directories are only deleted if +delete_dir+ is +true+.
63
+ def delete_node(node_or_alcn, delete_dir = false)
64
+ n = node_or_alcn.kind_of?(Node) ? node_or_alcn : @node_access[:alcn][node_or_alcn]
65
+ return if n.nil? || n == @dummy_root || (n.is_directory? && !delete_dir)
66
+
67
+ n.children.dup.each {|child| delete_node(child, delete_dir)}
68
+
69
+ website.blackboard.dispatch_msg(:before_node_deleted, n)
70
+ n.parent.children.delete(n)
71
+ @node_access[:alcn].delete(n.absolute_lcn)
72
+ @node_access[:acn][n.absolute_cn].delete(n)
73
+ @node_access[:path].delete(n.path)
74
+
75
+ node_info.delete(n.absolute_lcn)
76
+ end
77
+
78
+ end
79
+
80
+ end
@@ -0,0 +1,6 @@
1
+ module Webgen
2
+
3
+ # The version of webgen.
4
+ VERSION = '0.5.4'
5
+
6
+ end
@@ -0,0 +1,148 @@
1
+ # -*- ruby -*-
2
+ #
3
+ #--
4
+ # webgentask.rb:
5
+ #
6
+ # Define a task library for running webgen
7
+ #
8
+ # Copyright (C) 2007 Jeremy Hinegardner
9
+ #
10
+ # Tasks restructuration by Massimiliano Filacchioni
11
+ # Modifications for 0.5.0 by Thomas Leitner
12
+ #
13
+ # This program is free software; you can redistribute it and/or modify
14
+ # it under the terms of the GNU General Public License as published by
15
+ # the Free Software Foundation; either version 2 of the License, or (at
16
+ # your option) any later version.
17
+ #
18
+ # This program is distributed in the hope that it will be useful, but
19
+ # WITHOUT ANY WARRANTY; without even the implied warranty of
20
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21
+ # General Public License for more details.
22
+ #
23
+ # You should have received a copy of the GNU General Public License
24
+ # along with this program; if not, write to the Free Software
25
+ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
26
+ # USA
27
+ #
28
+ #++
29
+ #
30
+
31
+ require 'rake'
32
+ require 'rake/tasklib'
33
+
34
+ module Webgen
35
+
36
+ ##
37
+ # Task library to manage a webgen website.
38
+ #
39
+ # It is assumed that you have already used the 'webgen' command to create the website directory
40
+ # for the site.
41
+ #
42
+ # === Basics
43
+ #
44
+ # require 'webgen/webgentask'
45
+ #
46
+ # Webgen::WebgenTask.new
47
+ #
48
+ # === Attributes
49
+ #
50
+ # The attributes available in the new block are:
51
+ #
52
+ # * directory - the root directory of the webgen site
53
+ # (default Dir.pwd)
54
+ # * config - the config block for setting additional configuration options
55
+ # * clobber_outdir - remove webgens output directory on clobber
56
+ # (default false)
57
+ #
58
+ # === Tasks Provided
59
+ #
60
+ # The tasks provided are :
61
+ #
62
+ # * webgen - render the webgen website
63
+ # * clobber_webgen - remove all the files created during generation
64
+ #
65
+ # === Integrate webgen in other project
66
+ #
67
+ # To integrate webgen tasks in another project you can use rake namespaces. For example assuming
68
+ # webgen's site directory is +webgen+ under the main project directory use the following code
69
+ # fragment in project Rakefile:
70
+ #
71
+ # require 'webgen/webgentask'
72
+ #
73
+ # namespace :dev do
74
+ # Webgen::WebgenTask.new do |site|
75
+ # site.directory = File.join(Dir.pwd, "webgen")
76
+ # site.clobber_outdir = true
77
+ # site.config_block = lambda |config|
78
+ # config['website.lang'] = 'de'
79
+ # end
80
+ # end
81
+ # end
82
+ #
83
+ # task :clobber => ['dev:clobber_webgen']
84
+ #
85
+ # This will create the following tasks:
86
+ #
87
+ # * dev:webgen
88
+ # * dev:clobber_webgen
89
+ #
90
+ # and add dev:clobber_webgen to the main clobber task.
91
+ #
92
+ class WebgenTask < ::Rake::TaskLib
93
+
94
+ # The directory of the webgen website. This would be the directory of your <tt>config.yaml</tt>
95
+ # file. Or the parent directory of the <tt>src/</tt> directory for webgen.
96
+ #
97
+ # The default for this is assumed to be
98
+ # Dir.pwd
99
+ attr_accessor :directory
100
+
101
+ # The configuration block that is invoked when the Webgen::Website object is initialized. This
102
+ # can be used to set configuration parameters and to avoid having a <tt>config.yaml</tt> file
103
+ # lying around.
104
+ attr_accessor :config_block
105
+
106
+ # During the clobber, should webgen's output directory be clobbered. The default is false.
107
+ attr_accessor :clobber_outdir
108
+
109
+ # Create webgen tasks. You can override the task name with the parameter +name+.
110
+ def initialize(name = 'webgen')
111
+ @name = name
112
+ @directory = Dir.pwd
113
+ @clobber_outdir = false
114
+ @config_block = nil
115
+
116
+ yield self if block_given?
117
+
118
+ define
119
+ end
120
+
121
+ #######
122
+ private
123
+ #######
124
+
125
+ def define # :nodoc:
126
+ desc "Render the webgen website"
127
+ task @name, :verbosity, :log_level do |t, args|
128
+ require 'webgen/website'
129
+ website = Webgen::Website.new(@directory, Webgen::Logger.new($stdout), &@config_block)
130
+ website.logger.verbosity = args[:verbosity].to_s.intern unless args[:verbosity].to_s.empty?
131
+ website.logger.level = args[:log_level].to_i if args[:log_level]
132
+ website.render
133
+ end
134
+
135
+ task :clobber => paste('clobber_', @name)
136
+
137
+ desc "Remove webgen products"
138
+ task paste('clobber_', @name) do
139
+ require 'webgen/website'
140
+ website = Webgen::Website.new(@directory, Webgen::Logger.new($stdout), &@config_block)
141
+ website.clean(@clobber_outdir)
142
+ end
143
+ end
144
+
145
+ end
146
+
147
+ end
148
+
@@ -0,0 +1,214 @@
1
+ # Standard lib requires
2
+ require 'logger'
3
+ require 'set'
4
+ require 'fileutils'
5
+
6
+ # Requirements for Website
7
+ require 'webgen/coreext'
8
+ require 'webgen/loggable'
9
+ require 'webgen/logger'
10
+ require 'webgen/configuration'
11
+ require 'webgen/websiteaccess'
12
+ require 'webgen/blackboard'
13
+ require 'webgen/cache'
14
+ require 'webgen/tree'
15
+
16
+ # Files for autoloading
17
+ require 'webgen/common'
18
+ require 'webgen/source'
19
+ require 'webgen/output'
20
+ require 'webgen/sourcehandler'
21
+ require 'webgen/contentprocessor'
22
+
23
+ # Load other needed files
24
+ require 'webgen/path'
25
+ require 'webgen/node'
26
+ require 'webgen/page'
27
+
28
+
29
+ # The Webgen namespace houses all classes/modules used by webgen.
30
+ module Webgen
31
+
32
+ # Returns the data directory for webgen.
33
+ def self.data_dir
34
+ unless defined?(@@data_dir)
35
+ require 'rbconfig'
36
+ @@data_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'webgen'))
37
+ @@data_dir = File.expand_path(File.join(Config::CONFIG["datadir"], "webgen")) if !File.exists?(@@data_dir)
38
+ raise "Could not find webgen data directory! This is a bug, report it please!" unless File.directory?(@@data_dir)
39
+ end
40
+ @@data_dir
41
+ end
42
+
43
+
44
+ # Represents a webgen website and is used to render it.
45
+ class Website
46
+
47
+ # Raised when the configuration file of the website is invalid.
48
+ class ConfigFileInvalid < RuntimeError; end
49
+
50
+ include Loggable
51
+
52
+ # The website configuration. Can only be used after #init has been called (which is
53
+ # automatically done in #render).
54
+ attr_reader :config
55
+
56
+ # The blackboard used for inter-object communication. Can only be used after #init has been
57
+ # called.
58
+ attr_reader :blackboard
59
+
60
+ # A cache to store information that should be available between runs. Can only be used after
61
+ # #init has been called.
62
+ attr_reader :cache
63
+
64
+ # The internal data structure used to store information about individual nodes.
65
+ attr_reader :tree
66
+
67
+ # The logger used for logging. If set to +nil+, logging is disabled.
68
+ attr_accessor :logger
69
+
70
+ # The website directory.
71
+ attr_reader :directory
72
+
73
+ # Create a new webgen website for the website in the directory +dir+. You can provide a
74
+ # block (has to take the configuration object as parameter) for adjusting the configuration
75
+ # values during the initialization.
76
+ def initialize(dir, logger=Webgen::Logger.new($stdout, false), &block)
77
+ @blackboard = nil
78
+ @cache = nil
79
+ @config = nil
80
+ @logger = logger
81
+ @config_block = block
82
+ @directory = dir
83
+ end
84
+
85
+ # Define a service +service_name+ provided by the instance of +klass+. The parameter +method+
86
+ # needs to define the method which should be invoked when the service is invoked. Can only be
87
+ # used after #init has been called.
88
+ def autoload_service(service_name, klass, method = service_name)
89
+ blackboard.add_service(service_name) {|*args| cache.instance(klass).send(method, *args)}
90
+ end
91
+
92
+ # Initialize the configuration, blackboard and cache objects and load the default configuration
93
+ # as well as website specific extension files. An already existing configuration/blackboard is
94
+ # deleted!
95
+ def init
96
+ execute_in_env do
97
+ @blackboard = Blackboard.new
98
+ @config = Configuration.new
99
+
100
+ load 'webgen/default_config.rb'
101
+ Dir.glob(File.join(@directory, 'ext', '**/init.rb')) {|f| load(f)}
102
+ read_config_file
103
+
104
+ @config_block.call(@config) if @config_block
105
+ restore_tree_and_cache
106
+ end
107
+ self
108
+ end
109
+
110
+ # Render the website (after calling #init if the website is not already initialized).
111
+ def render
112
+ execute_in_env do
113
+ init unless @config
114
+
115
+ puts "Starting webgen..."
116
+ shm = SourceHandler::Main.new
117
+ shm.render(@tree)
118
+ save_tree_and_cache
119
+ puts "Finished"
120
+
121
+ if @logger && @logger.log_output.length > 0
122
+ puts "\nLog messages:"
123
+ puts @logger.log_output
124
+ end
125
+ end
126
+ end
127
+
128
+ # Clean the website directory from all generated output files (including the cache file). If
129
+ # +del_outdir+ is +true+, then the base output directory is also deleted. When a delete
130
+ # operation fails, the error is silently ignored and the clean operation continues.
131
+ #
132
+ # Note: Uses the configured output instance for the operations!
133
+ def clean(del_outdir = false)
134
+ init
135
+ execute_in_env do
136
+ output = @blackboard.invoke(:output_instance)
137
+ @tree.node_access[:alcn].each do |name, node|
138
+ next if node.is_fragment? || node['no_output'] || node.path == '/' || node == @tree.dummy_root
139
+ output.delete(node.path) rescue nil
140
+ end
141
+
142
+ if @config['website.cache'].first == :file
143
+ FileUtils.rm(File.join(@directory, @config['website.cache'].last)) rescue nil
144
+ end
145
+
146
+ if del_outdir
147
+ output.delete('/') rescue nil
148
+ end
149
+ end
150
+ end
151
+
152
+ # The provided block is executed within a proper environment sothat any object can access the
153
+ # Website object.
154
+ def execute_in_env
155
+ set_back = Thread.current[:webgen_website].nil?
156
+ Thread.current[:webgen_website] = self
157
+ yield
158
+ ensure
159
+ Thread.current[:webgen_website] = nil if set_back
160
+ end
161
+
162
+ #######
163
+ private
164
+ #######
165
+
166
+ # Restore the tree and the cache from +website.cache+ and returns the Tree object.
167
+ def restore_tree_and_cache
168
+ @cache = Cache.new
169
+ @tree = Tree.new
170
+ data = if config['website.cache'].first == :file
171
+ cache_file = File.join(@directory, config['website.cache'].last)
172
+ File.open(cache_file, 'rb') {|f| f.read} if File.exists?(cache_file)
173
+ else
174
+ config['website.cache'].last
175
+ end
176
+ cache_data, @tree = Marshal.load(data) rescue nil
177
+ @cache.restore(cache_data) if cache_data
178
+ end
179
+
180
+ # Save the +tree+ and the +cache+ to +website.cache+.
181
+ def save_tree_and_cache
182
+ cache_data = [@cache.dump, @tree]
183
+ if config['website.cache'].first == :file
184
+ cache_file = File.join(@directory, config['website.cache'].last)
185
+ File.open(cache_file, 'wb') {|f| Marshal.dump(cache_data, f)}
186
+ else
187
+ config['website.cache'][1] = Marshal.dump(cache_data)
188
+ end
189
+ end
190
+
191
+ # Update the configuration object for the website with infos found in the configuration file.
192
+ def read_config_file
193
+ file = File.join(@directory, 'config.yaml')
194
+ if File.exists?(file)
195
+ begin
196
+ config = YAML::load(File.read(file)) || {}
197
+ raise 'Structure of config file is not valid, has to be a Hash' if !config.kind_of?(Hash)
198
+ config.each do |key, value|
199
+ case key
200
+ when *Webgen::Configuration::Helpers.public_instance_methods(false) then @config.send(key, value)
201
+ else @config[key] = value
202
+ end
203
+ end
204
+ rescue RuntimeError, ArgumentError => e
205
+ raise ConfigFileInvalid, "Configuration invalid: " + e.message
206
+ end
207
+ elsif File.exists?(File.join(@directory, 'config.yml'))
208
+ log(:warn) { "No configuration file called config.yaml found (there is a config.yml - spelling error?)" }
209
+ end
210
+ end
211
+
212
+ end
213
+
214
+ end