webgen 0.5.7 → 0.5.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (207) hide show
  1. data/ChangeLog +870 -0
  2. data/Rakefile +37 -36
  3. data/VERSION +1 -1
  4. data/data/webgen/resources.yaml +2 -2
  5. data/data/webgen/webgui/app.rb +11 -0
  6. data/data/webgen/webgui/controller/main.rb +30 -26
  7. data/data/webgen/webgui/{view/page.xhtml → layout/default.xhtml} +8 -8
  8. data/data/webgen/webgui/start.rb +9 -0
  9. data/data/webgen/webgui/view/create_website.xhtml +6 -14
  10. data/data/webgen/webgui/view/manage_website.xhtml +2 -2
  11. data/data/webgen/website_bundles/default/README +6 -0
  12. data/data/webgen/website_bundles/default/src/index.page +15 -0
  13. data/data/webgen/{website_styles → website_bundles/style}/1024px/README +0 -0
  14. data/data/webgen/{website_styles → website_bundles/style}/1024px/src/default.css +0 -0
  15. data/data/webgen/{website_styles → website_bundles/style}/1024px/src/default.template +0 -0
  16. data/data/webgen/{website_styles → website_bundles/style}/1024px/src/images/background.gif +0 -0
  17. data/data/webgen/{website_styles → website_bundles/style}/andreas00/README +0 -0
  18. data/data/webgen/{website_styles → website_bundles/style}/andreas00/src/default.css +0 -0
  19. data/data/webgen/{website_styles → website_bundles/style}/andreas00/src/default.template +0 -0
  20. data/data/webgen/{website_styles → website_bundles/style}/andreas00/src/images/bg.gif +0 -0
  21. data/data/webgen/{website_styles → website_bundles/style}/andreas00/src/images/front.jpg +0 -0
  22. data/data/webgen/{website_styles → website_bundles/style}/andreas00/src/images/menubg.gif +0 -0
  23. data/data/webgen/{website_styles → website_bundles/style}/andreas00/src/images/menubg2.gif +0 -0
  24. data/data/webgen/{website_styles → website_bundles/style}/andreas01/README +0 -0
  25. data/data/webgen/{website_styles → website_bundles/style}/andreas01/src/default.css +0 -0
  26. data/data/webgen/{website_styles → website_bundles/style}/andreas01/src/default.template +0 -0
  27. data/data/webgen/{website_styles → website_bundles/style}/andreas01/src/images/bg.gif +0 -0
  28. data/data/webgen/{website_styles → website_bundles/style}/andreas01/src/images/front.jpg +0 -0
  29. data/data/webgen/{website_styles → website_bundles/style}/andreas01/src/print.css +0 -0
  30. data/data/webgen/{website_styles → website_bundles/style}/andreas03/README +0 -0
  31. data/data/webgen/{website_styles → website_bundles/style}/andreas03/src/default.css +0 -0
  32. data/data/webgen/{website_styles → website_bundles/style}/andreas03/src/default.template +0 -0
  33. data/data/webgen/{website_styles → website_bundles/style}/andreas03/src/images/bodybg.png +0 -0
  34. data/data/webgen/{website_styles → website_bundles/style}/andreas03/src/images/contbg.png +0 -0
  35. data/data/webgen/{website_styles → website_bundles/style}/andreas03/src/images/footerbg.png +0 -0
  36. data/data/webgen/{website_styles → website_bundles/style}/andreas03/src/images/gradient1.png +0 -0
  37. data/data/webgen/{website_styles → website_bundles/style}/andreas03/src/images/gradient2.png +0 -0
  38. data/data/webgen/{website_styles → website_bundles/style}/andreas04/README +0 -0
  39. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/default.css +0 -0
  40. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/default.template +0 -0
  41. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/blinkarrow.gif +0 -0
  42. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/bodybg.png +0 -0
  43. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/contentbg.png +0 -0
  44. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/entrybg.png +0 -0
  45. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/flash.gif +0 -0
  46. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/flash2.gif +0 -0
  47. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/globe.gif +0 -0
  48. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/globebottom.gif +0 -0
  49. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/linkarrow.gif +0 -0
  50. data/data/webgen/{website_styles → website_bundles/style}/andreas04/src/images/menuhover.png +0 -0
  51. data/data/webgen/{website_styles → website_bundles/style}/andreas05/README +0 -0
  52. data/data/webgen/{website_styles → website_bundles/style}/andreas05/src/default.css +0 -0
  53. data/data/webgen/{website_styles → website_bundles/style}/andreas05/src/default.template +0 -0
  54. data/data/webgen/{website_styles → website_bundles/style}/andreas05/src/images/bodybg.gif +0 -0
  55. data/data/webgen/{website_styles → website_bundles/style}/andreas05/src/images/front.png +0 -0
  56. data/data/webgen/{website_styles → website_bundles/style}/andreas06/README +0 -0
  57. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/default.css +6 -4
  58. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/default.template +2 -2
  59. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/images/bodybg.gif +0 -0
  60. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/images/boxbg.gif +0 -0
  61. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/images/greypx.gif +0 -0
  62. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/images/header.jpg +0 -0
  63. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/images/innerbg.gif +0 -0
  64. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/images/leaves.jpg +0 -0
  65. data/data/webgen/{website_styles → website_bundles/style}/andreas06/src/images/tabs.gif +0 -0
  66. data/data/webgen/{website_styles → website_bundles/style}/andreas07/README +0 -0
  67. data/data/webgen/{website_styles → website_bundles/style}/andreas07/src/browserfix.css +0 -0
  68. data/data/webgen/{website_styles → website_bundles/style}/andreas07/src/default.css +0 -0
  69. data/data/webgen/{website_styles → website_bundles/style}/andreas07/src/default.template +0 -0
  70. data/data/webgen/{website_styles → website_bundles/style}/andreas07/src/images/bodybg.gif +0 -0
  71. data/data/webgen/{website_styles → website_bundles/style}/andreas07/src/images/sidebarbg.gif +0 -0
  72. data/data/webgen/{website_styles → website_bundles/style}/andreas08/README +0 -0
  73. data/data/webgen/{website_styles → website_bundles/style}/andreas08/src/default.css +0 -0
  74. data/data/webgen/{website_styles → website_bundles/style}/andreas08/src/default.template +0 -0
  75. data/data/webgen/{website_styles → website_bundles/style}/andreas09/README +0 -0
  76. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/default.css +0 -0
  77. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/default.template +0 -0
  78. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/bodybg-black.jpg +0 -0
  79. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/bodybg-green.jpg +0 -0
  80. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/bodybg-orange.jpg +0 -0
  81. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/bodybg-purple.jpg +0 -0
  82. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/bodybg-red.jpg +0 -0
  83. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/bodybg.jpg +0 -0
  84. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/footerbg.jpg +0 -0
  85. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/menuhover-black.jpg +0 -0
  86. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/menuhover-green.jpg +0 -0
  87. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/menuhover-orange.jpg +0 -0
  88. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/menuhover-purple.jpg +0 -0
  89. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/menuhover-red.jpg +0 -0
  90. data/data/webgen/{website_styles → website_bundles/style}/andreas09/src/images/menuhover.jpg +0 -0
  91. data/data/webgen/{website_styles → website_bundles/style}/simple/README +0 -0
  92. data/data/webgen/{website_styles → website_bundles/style}/simple/src/default.css +0 -0
  93. data/data/webgen/{website_styles → website_bundles/style}/simple/src/default.template +0 -0
  94. data/data/webgen/website_skeleton/README +1 -1
  95. data/data/webgen/website_skeleton/config.yaml +5 -4
  96. data/doc/contentprocessor/blocks.page +43 -10
  97. data/doc/contentprocessor/builder.page +1 -1
  98. data/doc/contentprocessor/erb.page +12 -11
  99. data/doc/contentprocessor/redcloth.page +3 -1
  100. data/doc/extensions.page +3 -3
  101. data/doc/faq.page +13 -10
  102. data/doc/getting_started.page +12 -15
  103. data/doc/index.page +7 -1
  104. data/doc/manual.page +78 -27
  105. data/doc/reference_configuration.page +166 -3
  106. data/doc/reference_website_styles.page +28 -0
  107. data/doc/source/filesystem.page +39 -0
  108. data/doc/source/tararchive.page +40 -0
  109. data/doc/tag/tikz.page +2 -1
  110. data/doc/webgen_page_format.page +13 -12
  111. data/doc/website_styles.metainfo +8 -0
  112. data/lib/webgen/blackboard.rb +2 -2
  113. data/lib/webgen/cache.rb +4 -4
  114. data/lib/webgen/cli.rb +29 -16
  115. data/lib/webgen/cli/apply_command.rb +66 -0
  116. data/lib/webgen/cli/create_command.rb +22 -16
  117. data/lib/webgen/cli/utils.rb +23 -0
  118. data/lib/webgen/cli/webgui_command.rb +31 -16
  119. data/lib/webgen/configuration.rb +8 -6
  120. data/lib/webgen/contentprocessor.rb +4 -5
  121. data/lib/webgen/contentprocessor/blocks.rb +2 -0
  122. data/lib/webgen/contentprocessor/builder.rb +6 -3
  123. data/lib/webgen/contentprocessor/erb.rb +6 -3
  124. data/lib/webgen/contentprocessor/erubis.rb +7 -6
  125. data/lib/webgen/contentprocessor/haml.rb +6 -3
  126. data/lib/webgen/contentprocessor/rdoc.rb +0 -1
  127. data/lib/webgen/contentprocessor/redcloth.rb +3 -1
  128. data/lib/webgen/context.rb +73 -0
  129. data/lib/webgen/context/nodes.rb +36 -0
  130. data/lib/webgen/coreext.rb +3 -2
  131. data/lib/webgen/default_config.rb +3 -1
  132. data/lib/webgen/deprecated.rb +53 -0
  133. data/lib/webgen/node.rb +24 -19
  134. data/lib/webgen/output.rb +50 -7
  135. data/lib/webgen/page.rb +45 -36
  136. data/lib/webgen/path.rb +1 -1
  137. data/lib/webgen/source.rb +32 -4
  138. data/lib/webgen/source/resource.rb +3 -3
  139. data/lib/webgen/source/stacked.rb +1 -1
  140. data/lib/webgen/source/tararchive.rb +73 -0
  141. data/lib/webgen/sourcehandler.rb +4 -4
  142. data/lib/webgen/sourcehandler/base.rb +36 -24
  143. data/lib/webgen/sourcehandler/copy.rb +1 -1
  144. data/lib/webgen/sourcehandler/feed.rb +2 -2
  145. data/lib/webgen/sourcehandler/fragment.rb +1 -1
  146. data/lib/webgen/sourcehandler/metainfo.rb +15 -6
  147. data/lib/webgen/sourcehandler/page.rb +9 -5
  148. data/lib/webgen/sourcehandler/virtual.rb +44 -7
  149. data/lib/webgen/tag/base.rb +19 -13
  150. data/lib/webgen/tag/link.rb +1 -0
  151. data/lib/webgen/version.rb +1 -1
  152. data/lib/webgen/webgentask.rb +15 -13
  153. data/lib/webgen/website.rb +42 -11
  154. data/lib/webgen/websiteaccess.rb +1 -1
  155. data/lib/webgen/websitemanager.rb +61 -66
  156. data/man/man1/webgen.1 +4 -0
  157. data/misc/default.css +13 -0
  158. data/misc/default.template +1 -1
  159. data/misc/htmldoc.metainfo +2 -1
  160. data/misc/style.page +33 -0
  161. data/test/test_cli.rb +1 -7
  162. data/test/test_common_sitemap.rb +2 -2
  163. data/test/test_contentprocessor_blocks.rb +14 -1
  164. data/test/test_contentprocessor_builder.rb +3 -1
  165. data/test/test_contentprocessor_erb.rb +3 -2
  166. data/test/test_contentprocessor_erubis.rb +3 -3
  167. data/test/test_contentprocessor_fragments.rb +3 -3
  168. data/test/test_contentprocessor_haml.rb +3 -2
  169. data/test/test_contentprocessor_maruku.rb +3 -3
  170. data/test/test_contentprocessor_rdiscount.rb +1 -1
  171. data/test/test_contentprocessor_rdoc.rb +1 -1
  172. data/test/test_contentprocessor_redcloth.rb +9 -2
  173. data/test/test_contentprocessor_sass.rb +1 -1
  174. data/test/test_contentprocessor_tags.rb +1 -1
  175. data/test/{test_contentprocessor_context.rb → test_context.rb} +9 -7
  176. data/test/test_node.rb +27 -21
  177. data/test/test_page.rb +4 -4
  178. data/test/test_source_tararchive.rb +65 -0
  179. data/test/test_sourcehandler_fragment.rb +1 -1
  180. data/test/test_sourcehandler_memory.rb +6 -6
  181. data/test/test_sourcehandler_metainfo.rb +34 -13
  182. data/test/test_sourcehandler_page.rb +8 -0
  183. data/test/test_sourcehandler_virtual.rb +51 -12
  184. data/test/test_tag_breadcrumbtrail.rb +4 -4
  185. data/test/test_tag_coderay.rb +1 -1
  186. data/test/test_tag_date.rb +1 -1
  187. data/test/test_tag_executecommand.rb +1 -1
  188. data/test/test_tag_includefile.rb +3 -3
  189. data/test/test_tag_langbar.rb +6 -6
  190. data/test/test_tag_link.rb +8 -2
  191. data/test/test_tag_menu.rb +9 -9
  192. data/test/test_tag_metainfo.rb +1 -1
  193. data/test/test_tag_relocatable.rb +1 -1
  194. data/test/test_tag_sitemap.rb +1 -1
  195. data/test/test_tag_tikz.rb +2 -2
  196. data/test/test_website.rb +17 -0
  197. data/test/test_websitemanager.rb +16 -21
  198. metadata +146 -187
  199. data/data/webgen/website_templates/default/README +0 -6
  200. data/data/webgen/website_templates/default/src/index.page +0 -8
  201. data/data/webgen/website_templates/project/README +0 -5
  202. data/data/webgen/website_templates/project/src/about.page +0 -12
  203. data/data/webgen/website_templates/project/src/download.page +0 -15
  204. data/data/webgen/website_templates/project/src/features.page +0 -8
  205. data/data/webgen/website_templates/project/src/index.page +0 -9
  206. data/data/webgen/website_templates/project/src/screenshots.page +0 -18
  207. data/lib/webgen/contentprocessor/context.rb +0 -89
@@ -0,0 +1,28 @@
1
+ ---
2
+ title: Website Styles Reference
3
+ ---
4
+
5
+ Following is a list of all website styles that are included in the webgen distribution. Each style
6
+ can be used when creating a website by using the command
7
+
8
+ webgen create -b default -b STYLE_NAME SITE_DIR
9
+
10
+ or applied later using the command
11
+
12
+ webgen apply STYLE_NAME
13
+
14
+ When you click on the link provided for each website style, you will get a full browser preview of
15
+ the respective website style. You can then return to this list by using the *back button* of your
16
+ browser:
17
+
18
+ <%
19
+ context.content_node.tree.node_access[:alcn].select do |name, node|
20
+ node.is_directory? && node.parent == context.content_node.tree[File.join(context.content_node.parent.absolute_lcn, '/website_styles')]
21
+ end.sort.each do |name, node|
22
+ %>
23
+ <h2 id="<%= node.cn %>"><%= node.cn %></h2>
24
+ <div class="website-styles">
25
+ <%= context.dest_node.link_to(node, :link_text => "Full window version") %>
26
+ <object type="text/html" data="<%= context.dest_node.route_to(node) %>">Nothing</object>
27
+ </div>
28
+ <% end %>
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Webgen::Source::FileSystem
3
+ ---
4
+ ## Description
5
+
6
+ This is the default source extension used when creating a new webgen website. It uses files that
7
+ match a certain glob (default value for the glob is to match all files) under a specific directory.
8
+
9
+ > The default configuration for a new website uses all files under the `src` directory.
10
+ {.information}
11
+
12
+ The first parameter for the file system source is the directory under which the to-be-used files are
13
+ and the second, optional, parameter specifies a glob (see [Dir.glob]).
14
+
15
+ [Dir.glob]: http://ruby-doc.org/core/classes/Dir.html#M002375
16
+
17
+ ## Examples
18
+
19
+ The used sources can be specified via the [`sources` configuration option]({relocatable:
20
+ ../reference_configuration.html#sources}), so each of the examples below can be specified in the
21
+ `config.yaml` file.
22
+
23
+ 1. The default configuration: all files under the `src` folder of the website directory
24
+
25
+ sources: [[/, Webgen::Source::FileSystem, src]]
26
+
27
+ 2. The default configuration and additionally all files under a `misc` directory:
28
+
29
+ sources:
30
+ - [/, Webgen::Source::FileSystem, src]
31
+ - [/, Webgen::Source::FileSystem, misc]
32
+
33
+ 3. The default configuration and mounting all image files from an external directory under the
34
+ `/images/` directory:
35
+
36
+ sources:
37
+ - [/, Webgen::Source::FileSystem, src]
38
+ - [/images/, Webgen::Source::FileSystem, /media/storage/pictures, **/*.jpg]
39
+
@@ -0,0 +1,40 @@
1
+ ---
2
+ title: Webgen::Source::TarArchive
3
+ ---
4
+ ## Description
5
+
6
+ The tar archive source can be used to include the files from a (possibly gzipped) tar archive. The
7
+ used archive can be stored locally on the file system but it is also possible to use archives
8
+ accessible via the http(s) and ftp protcols.
9
+
10
+ > This extension is only available if you have installed the [archive-tar-minitar][1] library. The
11
+ > preferred way to do this is via Rubygems:
12
+ >
13
+ > gem install archive-tar-minitar
14
+ {.warning}
15
+
16
+ The first parameter for the tar archive source is the URL of the archive and the second, optional,
17
+ parameter specifies a glob (see [File.fnmatch]) for selecting the to-be-used files/directories in the
18
+ tar archive.
19
+
20
+ [File.fnmatch]: http://ruby-doc.org/core/classes/File.html#M002603
21
+ [1]: http://raa.ruby-lang.org/project/minitar/
22
+
23
+ ## Examples
24
+
25
+ The used sources can be specified via the [`sources` configuration option]({relocatable:
26
+ ../reference_configuration.html#sources}), so each of the examples below can be specified in the
27
+ `config.yaml` file.
28
+
29
+ 1. Using all files/directories from a local tar archive in addition the default configuration:
30
+
31
+ sources:
32
+ - [/, Webgen::Source::FileSystem, src]
33
+ - [/, Webgen::Source::TarArchive, archive.tar]
34
+
35
+ 2. Using images stored in a remote gzipped tar archive in addition to the default configuration:
36
+
37
+ sources:
38
+ - [/, Webgen::Source::FileSystem, src]
39
+ - [/, Webgen::Source::TarArchive, http://www.example.com/archive/data.tgz, **/*.jpg]
40
+
@@ -84,7 +84,8 @@ edge node {0,1,R} (A)
84
84
  <td>
85
85
  {tikz:: {path: chain.png, libraries: [arrows,automata,shadows,positioning],
86
86
  opts: "->,>=stealth,shorten >=1pt,auto,node distance=2.8cm,on grid,semithick,
87
- every state/.style={fill=red,draw=none,circular drop shadow,text=white}"}}
87
+ every state/.style={fill=red,draw=none,circular drop shadow,text=white}",
88
+ resolution: 300 72}}
88
89
  \node[initial,state] (A) {$q_a$};
89
90
  \node[state] (B) [above right=of A] {$q_b$};
90
91
  \node[state] (D) [below right=of A] {$q_d$};
@@ -10,7 +10,7 @@ easy to use.
10
10
  ## Structure
11
11
 
12
12
  A file using the Webgen Page Format consists of one or more blocks which are the smallest units
13
- recongnized. Blocks are separated from each other through a line containing three dashes. This is
13
+ recognized. Blocks are separated from each other through a line containing three dashes. This is
14
14
  illustrated in the following examples which are all valid files in WebPage Format:
15
15
 
16
16
  Example 1:
@@ -66,17 +66,18 @@ it, it feels like just writing a plain text document.
66
66
 
67
67
  A content block is used to provide content in a specific format. Each file in Webgen Page Format
68
68
  needs to have at least one content block which may be empty. However, it can have as many content
69
- blocks as necessary. Each content block needs to have a unique name and additional options can also
70
- be set.
71
-
72
- The name uniquely identifies a content block and is used to access it. The only option used by
73
- webgen is the `pipeline` option which specifies the processing pipeline for the block. The
74
- processing pipeline is used for rendering the block by using the specified content processors in the
75
- specified order. There are many different content processors available - have a look at the
76
- [extensions page]({relocatable: extensions.html}) for an overview.
77
-
78
- There are also defaults for the name and the options of a block but they can be overwritten. You can
79
- use one of two ways to do this:
69
+ blocks as necessary. This functionality can be used, for example, to provide the main content of an
70
+ HTML page in one block and sidebar content in another one.
71
+
72
+ Each content block needs to have a unique name and additional options can also be set. The name
73
+ uniquely identifies a content block and is used to access it. The only option used by webgen is the
74
+ `pipeline` option which specifies the processing pipeline for the block. The processing pipeline is
75
+ used for rendering the block by using the specified content processors in the specified order. There
76
+ are many different content processors available - have a look at the [extensions page]({relocatable:
77
+ extensions.html}) for an overview.
78
+
79
+ webgen extensions that use files in Webgen Page Format may specify defaults for the name and the
80
+ options of a block but these defaults can be overwritten. You can use one of two ways to do this:
80
81
 
81
82
  * you either specify the name and additional options of the block on the starting line with the
82
83
  three dashes
@@ -0,0 +1,8 @@
1
+ website_styles/*/default.template:
2
+ template: ~
3
+
4
+ website_styles/*/:
5
+ index_path: style.html
6
+
7
+ website_styles/:
8
+ index_path: ~
@@ -4,12 +4,12 @@ module Webgen
4
4
 
5
5
  # A blackboard object provides two features for inter-object communication:
6
6
  #
7
- # * services: An object can add a service to the blackboard which can be called by any other
7
+ # * *services*: An object can add a service to the blackboard which can be called by any other
8
8
  # object by just specifing the service name. Therefore it is easy to change the underlying
9
9
  # implementation of the service and there are no hard dependencies on specific class or method
10
10
  # names.
11
11
  #
12
- # * listeners: Objects may register themselves for specific messsage names and get notified when
12
+ # * *listeners*: Objects may register themselves for specific messsage names and get notified when
13
13
  # such a message gets dispatched.
14
14
  #
15
15
  # For a list of all available services and messages have a look at the main Webgen documentation
@@ -5,15 +5,15 @@ require 'facets/kernel/constant'
5
5
 
6
6
  module Webgen
7
7
 
8
- # A cache object provides access to various caches to speed up rendering of a website.
8
+ # A cache object provides access to various caches to speed up rendering of a website:
9
9
  #
10
- # permanent:: The permanent cache should be used for data that should be available between webgen
10
+ # [permanent] The permanent cache should be used for data that should be available between webgen
11
11
  # runs.
12
12
  #
13
- # volatile:: The volatile cache is used for data that can easily be regenerated but might be
13
+ # [volatile] The volatile cache is used for data that can easily be regenerated but might be
14
14
  # expensive to do so. This cache is not stored between webgen runs.
15
15
  #
16
- # standard:: The standard cache saves data between webgen runs and returns the cached data (not
16
+ # [standard] The standard cache saves data between webgen runs and returns the cached data (not
17
17
  # the newly set data) if it is available. This is useful, for example, to store file
18
18
  # modifcation times and check if a file has been changed between runs.
19
19
  #
@@ -8,16 +8,17 @@ module Webgen
8
8
 
9
9
  # Namespace for all classes that act as CLI commands.
10
10
  #
11
- # = Implementing a CLI command
11
+ # == Implementing a CLI command
12
12
  #
13
13
  # Each CLI command class needs to be put into this module and has to end with +Command+, otherwise
14
14
  # it is not used. A CLI command is an extension that can be invoked from the webgen command and
15
15
  # thus needs to be derived from CmdParse::Command. For detailed information on this class and the
16
16
  # whole cmdparse package have a look at http://cmdparse.rubyforge.org!
17
17
  #
18
- # = Sample CLI command
18
+ # == Sample CLI command
19
19
  #
20
- # Here is a sample CLI command extension:
20
+ # Here is a sample CLI command extension which could be put, for example, into the
21
+ # <tt>ext/init.rb</tt> of a webgen website:
21
22
  #
22
23
  # require 'webgen/cli'
23
24
  #
@@ -26,13 +27,13 @@ module Webgen
26
27
  # def initialize
27
28
  # super('sample', false)
28
29
  # self.short_desc = "This sample command just outputs its parameters"
29
- # self.description = Utils.format("Uses the global verbosity level and outputs additional " +
30
+ # self.description = Webgen::CLI::Utils.format("Uses the global verbosity level and outputs additional " +
30
31
  # "information when the level is set to verbose!")
31
32
  # @username = nil
32
33
  # self.options = CmdParse::OptionParserWrapper.new do |opts|
33
34
  # opts.separator "Options:"
34
35
  # opts.on('-u', '--user USER', String,
35
- # 'Specify an additional user name to output') {|@username|}
36
+ # 'Specify an additional user name to output') {|username| @username = username}
36
37
  # end
37
38
  # end
38
39
  #
@@ -51,8 +52,8 @@ module Webgen
51
52
  #
52
53
  # end
53
54
  #
54
- # Note the use of Utils.format in the initialize method so that the long text gets wrapped
55
- # correctly! The Utils class provides some other useful methods, too!
55
+ # Note the use of Webgen::CLI::Utils.format in the initialize method so that the long text gets
56
+ # wrapped correctly! The Utils class provides some other useful methods, too!
56
57
  #
57
58
  # For information about which attributes are available on the webgen command parser instance have
58
59
  # a look at Webgen::CLI::CommandParser!
@@ -61,6 +62,7 @@ module Webgen
61
62
  autoload :RunCommand, 'webgen/cli/run_command'
62
63
  autoload :CreateCommand, 'webgen/cli/create_command'
63
64
  autoload :WebguiCommand, 'webgen/cli/webgui_command'
65
+ autoload :ApplyCommand, 'webgen/cli/apply_command'
64
66
 
65
67
  autoload :Utils, 'webgen/cli/utils'
66
68
 
@@ -84,7 +86,7 @@ module Webgen
84
86
  # set or empty, the current working directory.
85
87
  def initialize # :nodoc:
86
88
  super(true)
87
- @directory = (ENV['WEBGEN_WEBSITE'].to_s.empty? ? Dir.pwd : ENV['WEBGEN_WEBSITE'])
89
+ @directory = nil
88
90
  @verbosity = :normal
89
91
  @log_level = ::Logger::WARN
90
92
  @log_filter = nil
@@ -101,19 +103,30 @@ module Webgen
101
103
  end
102
104
  self.add_command(CmdParse::HelpCommand.new)
103
105
  self.add_command(CmdParse::VersionCommand.new)
104
- Webgen::CLI.constants.select {|c| c =~ /.+Command$/ }.each do |c|
105
- self.add_command(Webgen::CLI.const_get(c).new, (c.to_s == 'RunCommand' ? true : false))
106
- end
107
106
  end
108
107
 
109
108
  # Utility method for sub-commands to create the correct Webgen::Website object.
110
109
  def create_website
111
- website = Webgen::Website.new(@directory) do |config|
112
- config['logger.mask'] = @log_filter
110
+ if !defined?(@website)
111
+ @website = Webgen::Website.new(@directory) do |config|
112
+ config['logger.mask'] = @log_filter
113
+ end
114
+ @website.logger.level = @log_level
115
+ @website.logger.verbosity = @verbosity
116
+ end
117
+ @website
118
+ end
119
+
120
+ # :nodoc:
121
+ def parse(argv = ARGV)
122
+ super do |level, cmd_name|
123
+ if level == 0
124
+ create_website.init
125
+ Webgen::CLI.constants.select {|c| c =~ /.+Command$/ }.each do |c|
126
+ self.add_command(Webgen::CLI.const_get(c).new, (c.to_s == 'RunCommand' ? true : false))
127
+ end
128
+ end
113
129
  end
114
- website.logger.level = @log_level
115
- website.logger.verbosity = @verbosity
116
- website
117
130
  end
118
131
 
119
132
  end
@@ -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 applying a bundle to a webgen website.
9
+ class ApplyCommand < CmdParse::Command
10
+
11
+ def initialize #:nodoc:
12
+ super('apply', false)
13
+ @force = false
14
+
15
+ self.short_desc = 'Apply a website bundle to an existing webgen website'
16
+ self.options = CmdParse::OptionParserWrapper.new do |opts|
17
+ opts.separator "Options:"
18
+ opts.on('-f', '--[no-]force', 'Specifies whether files should be overwritten (default: no)') do |val|
19
+ @force = val
20
+ end
21
+ opts.separator ""
22
+ opts.separator "Arguments:"
23
+ opts.separator opts.summary_indent + "BUNDLE_NAME: The name of a bundle shipped with webgen. The name is "
24
+ opts.separator opts.summary_indent + " matched against all possible bundle names and if there is only "
25
+ opts.separator opts.summary_indent + " match the bundle is applied."
26
+ opts.separator opts.summary_indent + "BUNDLE_URL: The URL of a bundle (needs to be a tar archive"
27
+ end
28
+ end
29
+
30
+ def usage # :nodoc:
31
+ "Usage: #{commandparser.program_name} [global options] apply [options] (BUNDLE_NAME|BUNDLE_URL)"
32
+ end
33
+
34
+ def show_help # :nodoc:
35
+ super
36
+ wm = Webgen::WebsiteManager.new(commandparser.directory)
37
+
38
+ puts
39
+ puts "Available bundles:"
40
+ puts Utils.headline('Bundles')
41
+ wm.bundles.sort.each {|name, entry| Utils.hash_output(name, entry.instance_eval { @table }) }
42
+ end
43
+
44
+ # Apply the style specified in <tt>args[0]</tt> to the webgen website.
45
+ def execute(args)
46
+ wm = Webgen::WebsiteManager.new(commandparser.directory)
47
+ if !File.directory?(commandparser.directory)
48
+ raise "You need to specify a valid webgen website directory!"
49
+ elsif args.length == 0
50
+ raise OptionParser::MissingArgument.new('STYLE')
51
+ else
52
+ name = Utils.match_bundle_name(wm, args[0])
53
+ puts "The following files in the website directory will be created or overwritten:"
54
+ puts wm.bundles[name].paths.sort.join("\n")
55
+ continue = @force
56
+ if !continue
57
+ print "Procede? (yes/no): "
58
+ continue = ($stdin.readline =~ /y(es)?/)
59
+ end
60
+ wm.apply_bundle(name) if continue
61
+ end
62
+ end
63
+
64
+ end
65
+
66
+ end
@@ -11,17 +11,17 @@ module Webgen::CLI
11
11
  def initialize #:nodoc:
12
12
  super('create', false)
13
13
  self.description = Utils.format("If the verbosity level is set to verbose, the created files are listed.")
14
- @template = 'default'
15
- @style = 'andreas07'
14
+ @bundles = []
16
15
 
17
- self.short_desc = 'Create a basic webgen website with selectable template/style'
16
+ self.short_desc = 'Create a basic webgen website from website bundles'
18
17
  self.options = CmdParse::OptionParserWrapper.new do |opts|
19
18
  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)
19
+ opts.on('-b', '--bundle BUNDLE', String, "A website bundle name/URL or 'none'. Can be used more than once (default: [default, style-andreas07])") do |val|
20
+ if val.downcase == 'none'
21
+ @bundles = nil
22
+ elsif !@bundles.nil?
23
+ @bundles << val
24
+ end
25
25
  end
26
26
  opts.separator ""
27
27
  opts.separator "Arguments:"
@@ -38,11 +38,9 @@ module Webgen::CLI
38
38
  wm = Webgen::WebsiteManager.new(commandparser.directory)
39
39
 
40
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 }) }
41
+ puts "Available bundles:"
42
+ puts Utils.headline('Bundles')
43
+ wm.bundles.sort.each {|name, entry| Utils.hash_output(name, entry.instance_eval { @table }) }
46
44
  end
47
45
 
48
46
  # Create a webgen website in the directory <tt>args[0]</tt>.
@@ -52,11 +50,19 @@ module Webgen::CLI
52
50
  else
53
51
  wm = Webgen::WebsiteManager.new(args[0])
54
52
  paths = wm.create_website
55
- paths += wm.apply_template(@template) if @template
56
- paths += wm.apply_style(@style) if @style
53
+ begin
54
+ if @bundles
55
+ @bundles = ['default', 'style-andreas07'] if @bundles.empty?
56
+ @bundles.each {|name| paths += wm.apply_bundle(Utils.match_bundle_name(wm, name)) }
57
+ end
58
+ rescue
59
+ require 'fileutils'
60
+ FileUtils.rm_rf(args[0])
61
+ raise
62
+ end
57
63
  if commandparser.verbosity == :verbose
58
64
  puts "The following files were created in the directory #{args[0]}:"
59
- puts paths.sort.collect {|f| "- " + f }.join("\n")
65
+ puts paths.sort.join("\n")
60
66
  end
61
67
  end
62
68
  end
@@ -83,6 +83,29 @@ module Webgen::CLI
83
83
  puts
84
84
  end
85
85
 
86
+ # Tries to match +name+ to a unique bundle name of the WebsiteManager +wm+. If this can not be
87
+ # done, it is checked whether +name+ is actually a valid bundle URL and if so, the URL source is
88
+ # added to the bundles of +wm+.
89
+ #
90
+ # Returns the correct bundle name or raises an error.
91
+ def self.match_bundle_name(wm, name)
92
+ matches = wm.bundles.keys.select {|k| k =~ /#{Regexp.escape(name)}/}
93
+ if matches.size > 1
94
+ raise ArgumentError.new("#{name} matches more than one bundle: #{matches.join(", ")}")
95
+ elsif matches.size == 0
96
+ begin
97
+ source = Webgen::Source::TarArchive.new(name)
98
+ wm.add_source(source, 'custom-URL-source')
99
+ name = 'custom-URL-source'
100
+ rescue
101
+ raise ArgumentError.new("#{name} is neither a valid bundle name nor a valid URL")
102
+ end
103
+ else
104
+ name = matches.first
105
+ end
106
+ name
107
+ end
108
+
86
109
  end
87
110
 
88
111
  end