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,43 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Webgen::SourceHandler
4
+
5
+ # This source handler should be used for handling nodes that are created during the write
6
+ # phase.
7
+ class Memory
8
+
9
+ include Webgen::WebsiteAccess
10
+ include Base
11
+
12
+ def initialize #:nodoc:
13
+ website.blackboard.add_listener(:node_flagged) do |node, *flags|
14
+ node.tree[node.node_info[:memory_source_alcn]].flag(:dirty) if node.node_info[:memory_source_alcn]
15
+ end
16
+ end
17
+
18
+ # Create a node under +parent+ for the +path+. The +source_alcn+ specified the node that creates
19
+ # this memory node when written. You have two options for providing the content for this node:
20
+ # either you set +data+ to a string (or a Webgen::Path::SourceIO object) or you provide a block
21
+ # which takes the created node as argument and return a string (or a Webgen::Path::SourceIO
22
+ # object).
23
+ def create_node(parent, path, source_alcn, data = nil)
24
+ super(parent, path) do |node|
25
+ node.node_info[:memory_source_alcn] = source_alcn
26
+ (@data ||= {})[node.absolute_lcn] = lambda { data || yield(node) }
27
+ end
28
+ end
29
+
30
+ # Return the content of the memory +node+. If the memory node was not created in this webgen
31
+ # run, it will be flagged for reinitialization (and therefore recreation).
32
+ def content(node)
33
+ if @data && @data[node.absolute_lcn]
34
+ @data[node.absolute_lcn].call
35
+ else
36
+ node.flag(:reinit)
37
+ nil
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ end
@@ -0,0 +1,128 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'pathname'
4
+ require 'yaml'
5
+
6
+ module Webgen::SourceHandler
7
+
8
+ # Handles meta information files which provide meta information for other files.
9
+ class Metainfo
10
+
11
+ include Base
12
+ include Webgen::WebsiteAccess
13
+
14
+ CKEY = [:metainfo, :nodes]
15
+
16
+ # Upon creation the object registers itself as listener for some node hooks.
17
+ def initialize
18
+ website.blackboard.add_listener(:node_meta_info_changed?, method(:node_meta_info_changed?))
19
+ website.blackboard.add_listener(:before_node_created, method(:before_node_created))
20
+ website.blackboard.add_listener(:before_node_deleted, method(:before_node_deleted))
21
+ website.blackboard.add_listener(:after_node_created, method(:after_node_created))
22
+ self.nodes ||= []
23
+ end
24
+
25
+ # Create a meta info node from +parent+ and +path+.
26
+ def create_node(parent, path)
27
+ page = page_from_path(path)
28
+ super(parent, path) do |node|
29
+ [[:mi_paths, 'paths'], [:mi_alcn, 'alcn']].each do |mi_key, block_name|
30
+ node.node_info[mi_key] = {}
31
+ if page.blocks.has_key?(block_name) && (data = YAML::load(page.blocks[block_name].content))
32
+ data.each do |key, value|
33
+ key = Webgen::Common.absolute_path(key, parent.absolute_lcn)
34
+ node.node_info[mi_key][key] = value
35
+ end
36
+ end
37
+ end
38
+
39
+ mark_all_matched_dirty(node, :no_old_data)
40
+
41
+ website.cache.permanent[[:sh_metainfo_node_mi, node.absolute_lcn]] = {
42
+ :mi_paths => node.node_info[:mi_paths],
43
+ :mi_alcn => node.node_info[:mi_alcn]
44
+ }
45
+
46
+ self.nodes << node unless self.nodes.include?(node)
47
+ self.nodes = self.nodes.sort_by {|n| n.absolute_lcn}
48
+ end
49
+ end
50
+
51
+ def nodes #:nodoc:
52
+ website.cache.permanent[CKEY]
53
+ end
54
+
55
+ def nodes=(val) #:nodoc:
56
+ website.cache.permanent[CKEY] = val
57
+ end
58
+
59
+ #######
60
+ private
61
+ #######
62
+
63
+ # Return +true+ if any meta information for +node+ provided by +mi_node+ has changed.
64
+ def meta_info_changed?(mi_node, node, option = nil)
65
+ cached = website.cache.permanent[[:sh_metainfo_node_mi, mi_node.absolute_lcn]]
66
+ (mi_node.node_info[:mi_paths].any? do |pattern, mi|
67
+ Webgen::Path.match(node.node_info[:creation_path], pattern) &&
68
+ (option == :force || (!cached && option == :no_old_data) || mi != cached[:mi_paths][pattern])
69
+ end || mi_node.node_info[:mi_alcn].any? do |pattern, mi|
70
+ node =~ pattern && (option == :force || (!cached && option == :no_old_data) || mi != cached[:mi_alcn][pattern])
71
+ end || (option == :no_old_data && cached &&
72
+ ((cached[:mi_paths].keys - mi_node.node_info[:mi_paths].keys).any? do |p|
73
+ Webgen::Path.match(node.node_info[:creation_path], p)
74
+ end || (cached[:mi_alcn].keys - mi_node.node_info[:mi_alcn].keys).any? do |p|
75
+ node =~ p
76
+ end)
77
+ )
78
+ )
79
+ end
80
+
81
+ # Mark all nodes that are matched by a path or an alcn specifcation in the meta info node +node+
82
+ # as dirty.
83
+ def mark_all_matched_dirty(node, option = nil)
84
+ node.tree.node_access[:alcn].each do |path, n|
85
+ n.flag(:dirty_meta_info) if meta_info_changed?(node, n, option)
86
+ end
87
+ end
88
+
89
+ # Update the meta info of matched path before a node is created.
90
+ def before_node_created(parent, path)
91
+ self.nodes.each do |node|
92
+ node.node_info[:mi_paths].each do |pattern, mi|
93
+ path.meta_info.update(mi) if Webgen::Path.match(path, pattern)
94
+ end
95
+ end
96
+ end
97
+
98
+ # Update the meta information of a matched alcn after the node has been created.
99
+ def after_node_created(node)
100
+ self.nodes.each do |n|
101
+ n.node_info[:mi_alcn].each do |pattern, mi|
102
+ node.meta_info.update(mi) if node =~ pattern
103
+ end
104
+ end
105
+ end
106
+
107
+ # Check if the +node+ has meta information from any meta info node and if so, if the meta info
108
+ # node in question has changed.
109
+ def node_meta_info_changed?(node)
110
+ self.nodes.each do |n|
111
+ if n.flagged(:created) && meta_info_changed?(n, node)
112
+ node.flag(:dirty_meta_info)
113
+ return
114
+ end
115
+ end
116
+ end
117
+
118
+ # Delete the meta info node +node+ from the internal array.
119
+ def before_node_deleted(node)
120
+ return unless node.node_info[:processor] == self.class.name
121
+ mark_all_matched_dirty(node, :force)
122
+ website.cache.permanent.delete([:sh_metainfo_node_mi, node.absolute_lcn])
123
+ self.nodes.delete(node)
124
+ end
125
+
126
+ end
127
+
128
+ end
@@ -0,0 +1,59 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Webgen::SourceHandler
4
+
5
+ # Source handler for handling content files in Webgen Page Format.
6
+ class Page
7
+
8
+ include Webgen::WebsiteAccess
9
+ include Base
10
+
11
+ def initialize #:nodoc:
12
+ website.blackboard.add_listener(:node_meta_info_changed?, method(:meta_info_changed?))
13
+ end
14
+
15
+ # Create a page file from +parent+ and +path+.
16
+ def create_node(parent, path)
17
+ page = page_from_path(path)
18
+ path.meta_info['lang'] ||= website.config['website.lang']
19
+ path.ext = 'html' if path.ext == 'page'
20
+
21
+ super(parent, path) do |node|
22
+ node.node_info[:sh_page_node_mi] = Webgen::Page.meta_info_from_data(path.io.data)
23
+ node.node_info[:page] = page
24
+ end
25
+ end
26
+
27
+ # Render the block called +block_name+ of the given +node+. The parameter +templates+ is set to
28
+ # the default template chain for the given +node+ but you can assign a custom template chain (an
29
+ # array of template nodes) if need arises. Return +nil+ if an error occurred.
30
+ def render_node(node, block_name = 'content', templates = website.blackboard.invoke(:templates_for_node, node))
31
+ chain = [templates, node].flatten
32
+
33
+ if chain.first.node_info[:page].blocks.has_key?(block_name)
34
+ node.node_info[:used_nodes] << chain.first.absolute_lcn
35
+ context = chain.first.node_info[:page].blocks[block_name].render(Webgen::ContentProcessor::Context.new(:chain => chain))
36
+ context.content
37
+ else
38
+ raise "Error rendering <#{node.absolute_lcn}>: no block named '#{block_name}' in <#{chain.first.absolute_lcn}>"
39
+ end
40
+ end
41
+ alias_method :content, :render_node
42
+
43
+ #######
44
+ private
45
+ #######
46
+
47
+ # Checks if the meta information provided by the file in Webgen Page Format changed.
48
+ def meta_info_changed?(node)
49
+ path = website.blackboard.invoke(:source_paths)[node.node_info[:src]]
50
+ return if node.node_info[:processor] != self.class.name || !path.changed?
51
+
52
+ old_mi = node.node_info[:sh_page_node_mi]
53
+ new_mi = Webgen::Page.meta_info_from_data(path.io.data)
54
+ node.flag(:dirty_meta_info) if old_mi && old_mi != new_mi
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,60 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'uri'
4
+ require 'time'
5
+
6
+ module Webgen::SourceHandler
7
+
8
+ # Source handler for creating an XML sitemap based on the specification of http://sitemaps.org.
9
+ #
10
+ # Uses Webgen::Common::Sitemap to generate the needed sitemap tree and to check if a sitemap has
11
+ # changed.
12
+ class Sitemap
13
+
14
+ include Webgen::WebsiteAccess
15
+ include Base
16
+
17
+ # Create an XML sitemap from +parent+ and +path+.
18
+ def create_node(parent, path)
19
+ page_from_path(path)
20
+ path.ext = 'xml'
21
+ raise "Needed information site_url missing for sitemap <#{path}>" if path.meta_info['site_url'].nil?
22
+ super(parent, path)
23
+ end
24
+
25
+ # Return the rendered feed represented by +node+.
26
+ def content(node)
27
+ require 'builder'
28
+ list = website.blackboard.invoke(:create_sitemap, node, node.lang, options_for_node(node)).to_lcn_list.flatten
29
+ sitemap = ::Builder::XmlMarkup.new(:indent => 2)
30
+ sitemap.instruct!(:xml, :version => '1.0', :encoding => 'UTF-8')
31
+ sitemap.urlset(:xmlns => "http://www.sitemaps.org/schemas/sitemap/0.9") do
32
+ list.each do |alcn|
33
+ item = node.tree[alcn]
34
+ sitemap.url do |url|
35
+ sitemap.loc(URI.escape(File.join(node['site_url'], item.path)))
36
+ sitemap.lastmod(item['modified_at'].iso8601)
37
+ changefreq = item['change_freq'] || node['default_change_freq']
38
+ sitemap.changefreq(changefreq) if changefreq
39
+ priority = item['priority'] || node['default_priority']
40
+ sitemap.priority(priority) if priority
41
+ end
42
+ end
43
+ end
44
+ sitemap.target!
45
+ end
46
+
47
+ #######
48
+ private
49
+ #######
50
+
51
+ # Return a hash with the sitemap-creation-options set on the +node+.
52
+ def options_for_node(node)
53
+ options = {}
54
+ node.meta_info.each {|k,v| options[k] = v if k =~ /\./}
55
+ options
56
+ end
57
+
58
+ end
59
+
60
+ end
@@ -0,0 +1,66 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ module Webgen::SourceHandler
4
+
5
+ # Source handler for handling template files in Webgen Page Format.
6
+ class Template
7
+
8
+ include Webgen::WebsiteAccess
9
+ include Webgen::Loggable
10
+ include Base
11
+
12
+ # Create a template node in +parent+ for +path+.
13
+ def create_node(parent, path)
14
+ page = page_from_path(path)
15
+ super(parent, path) do |node|
16
+ node.node_info[:page] = page
17
+ end
18
+ end
19
+
20
+ # Return the template chain for +node+.
21
+ def templates_for_node(node, lang = node.lang)
22
+ cached_template = (website.cache.volatile[[node.absolute_lcn, :templates]] ||= {})
23
+ if cached_template[lang]
24
+ template_node = cached_template[lang]
25
+ elsif node['template'].kind_of?(String)
26
+ template_node = node.resolve(node['template'], lang)
27
+ if template_node.nil?
28
+ log(:warn) { "Specified template '#{node['template']}' for <#{node.absolute_lcn}> not found, using default template!" }
29
+ template_node = default_template(node.parent, lang)
30
+ end
31
+ cached_template[lang] = template_node
32
+ elsif node.meta_info.has_key?('template') && node['template'].nil?
33
+ template_node = cached_template[lang] = nil
34
+ else
35
+ log(:info) { "Using default template in language '#{lang}' for <#{node.absolute_lcn}>" }
36
+ template_node = default_template(node.parent, lang)
37
+ if template_node == node && !node.parent.is_root?
38
+ template_node = default_template(node.parent.parent, lang)
39
+ end
40
+ cached_template[lang] = template_node
41
+ end
42
+
43
+ if template_node.nil?
44
+ []
45
+ else
46
+ (template_node == node ? [] : templates_for_node(template_node, lang) + [template_node])
47
+ end
48
+ end
49
+
50
+ # Return the default template for the directory node +dir+. If the template node is not found,
51
+ # the parent directories are searched.
52
+ def default_template(dir_node, lang)
53
+ template_node = dir_node.resolve(website.config['sourcehandler.template.default_template'], lang)
54
+ if template_node.nil?
55
+ if dir_node.is_root?
56
+ log(:warn) { "No default template in root directory found!" }
57
+ else
58
+ template_node = default_template(dir_node.parent, lang)
59
+ end
60
+ end
61
+ template_node
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -0,0 +1,110 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ require 'uri'
4
+ require 'yaml'
5
+
6
+ module Webgen::SourceHandler
7
+
8
+ # Handles files which contain specifications for "virtual" nodes, ie. nodes that don't have real
9
+ # source path.
10
+ #
11
+ # This can be used, for example, to provide multiple links to the same node.
12
+ class Virtual
13
+
14
+ include Base
15
+ include Webgen::WebsiteAccess
16
+
17
+ def initialize # :nodoc:
18
+ website.blackboard.add_listener(:node_meta_info_changed?, method(:node_meta_info_changed?))
19
+ @path_data = {}
20
+ end
21
+
22
+ # Create all virtual nodes under +parent+ which are specified in +path+.
23
+ def create_node(parent, path)
24
+ nodes = []
25
+ read_data(path).each do |key, meta_info|
26
+ cache_data = [key, meta_info.dup]
27
+
28
+ key = Webgen::Common.absolute_path(key, parent.absolute_lcn) + (key =~ /\/$/ ? '/' : '')
29
+ temp_parent = create_directories(parent.tree.root, File.dirname(key), path)
30
+
31
+ output_path = meta_info.delete('url') || key
32
+ output_path = (URI::parse(output_path).absolute? || output_path =~ /^\// ?
33
+ output_path : File.join(temp_parent.absolute_lcn, output_path))
34
+
35
+ if key =~ /\/$/
36
+ nodes << create_directory(temp_parent, key, path, meta_info)
37
+ else
38
+ nodes += website.blackboard.invoke(:create_nodes, parent.tree, temp_parent.absolute_lcn,
39
+ Webgen::Path.new(key, path.source_path), self) do |cn_parent, cn_path|
40
+ cn_path.meta_info.update(meta_info)
41
+ super(cn_parent, cn_path, output_path) do |n|
42
+ n.node_info[:sh_virtual_cache_data] = cache_data
43
+ end
44
+ end
45
+ end
46
+ end
47
+ nodes.compact
48
+ end
49
+
50
+ #######
51
+ private
52
+ #######
53
+
54
+ # Read the entries from the virtual file +data+ and yield the path, and the meta info hash for
55
+ # each entry. The +parent+ parameter is used for making absolute path values if relative ones
56
+ # are given.
57
+ def read_data(path)
58
+ if !@path_data.has_key?(path) || path.changed?
59
+ page = page_from_path(path)
60
+ @path_data[path] = YAML::load(page.blocks['content'].content).collect do |key, meta_info|
61
+ meta_info ||= {}
62
+ meta_info['modified_at'] = path.meta_info['modified_at']
63
+ meta_info['no_output'] = true
64
+ [key, meta_info]
65
+ end if page.blocks.has_key?('content')
66
+ @path_data[path] ||= []
67
+ end
68
+ @path_data[path]
69
+ end
70
+
71
+ # Create the needed parent directories for a virtual node.
72
+ def create_directories(parent, dirname, path)
73
+ dirname.sub(/^\//, '').split('/').each do |dir|
74
+ parent = create_directory(parent, File.join(parent.absolute_lcn, dir), path)
75
+ end
76
+ parent
77
+ end
78
+
79
+ # Create a virtual directory if it does not already exist.
80
+ def create_directory(parent, dir, path, meta_info = nil)
81
+ dir_handler = website.cache.instance('Webgen::SourceHandler::Directory')
82
+ website.blackboard.invoke(:create_nodes, parent.tree, parent.absolute_lcn,
83
+ Webgen::Path.new(File.join(dir, '/'), path.source_path),
84
+ dir_handler) do |par, temp_path|
85
+ parent = dir_handler.node_exists?(par, temp_path)
86
+ if (parent && (parent.node_info[:src] == path.source_path) && !meta_info.nil?) ||
87
+ !parent
88
+ temp_path.meta_info.update(meta_info) if meta_info
89
+ parent.flag(:reinit) if parent
90
+ parent = dir_handler.create_node(par, temp_path)
91
+ end
92
+ parent
93
+ end
94
+ parent
95
+ end
96
+
97
+ # Check if the +node+ is virtual and if, if its meta information has changed. This can only be
98
+ # the case if the node has been recreated in this run.
99
+ def node_meta_info_changed?(node)
100
+ path = website.blackboard.invoke(:source_paths)[node.node_info[:src]]
101
+ return if node.node_info[:processor] != self.class.name || !path.changed?
102
+
103
+ old_data = node.node_info[:sh_virtual_cache_data]
104
+ new_data = read_data(path).find {|key, mi| key == old_data.first}
105
+ node.flag(:dirty_meta_info) if !new_data || old_data.last != new_data.last
106
+ end
107
+
108
+ end
109
+
110
+ end