thewoolleyman-webgen 0.5.8.20090419
Sign up to get free protection for your applications and to get access to all the features.
- data/AUTHORS +8 -0
- data/COPYING +10 -0
- data/GPL +340 -0
- data/Rakefile +334 -0
- data/THANKS +18 -0
- data/bin/webgen +12 -0
- data/data/webgen/resources.yaml +3 -0
- data/data/webgen/webgui/controller/main.rb +135 -0
- data/data/webgen/webgui/overrides/win32console.rb +0 -0
- data/data/webgen/webgui/public/css/jquery.autocomplete.css +50 -0
- data/data/webgen/webgui/public/css/ramaze_error.css +90 -0
- data/data/webgen/webgui/public/css/style.css +55 -0
- data/data/webgen/webgui/public/img/headerbg.jpg +0 -0
- data/data/webgen/webgui/public/img/webgen_logo.png +0 -0
- data/data/webgen/webgui/public/js/jquery.autocomplete.js +15 -0
- data/data/webgen/webgui/public/js/jquery.js +32 -0
- data/data/webgen/webgui/view/create_website.xhtml +22 -0
- data/data/webgen/webgui/view/error.xhtml +64 -0
- data/data/webgen/webgui/view/index.xhtml +22 -0
- data/data/webgen/webgui/view/manage_website.xhtml +18 -0
- data/data/webgen/webgui/view/page.xhtml +40 -0
- data/data/webgen/website_skeleton/README +10 -0
- data/data/webgen/website_skeleton/Rakefile +40 -0
- data/data/webgen/website_skeleton/config.yaml +17 -0
- data/data/webgen/website_skeleton/ext/init.rb +10 -0
- data/data/webgen/website_styles/1024px/README +13 -0
- data/data/webgen/website_styles/1024px/src/default.css +188 -0
- data/data/webgen/website_styles/1024px/src/default.template +60 -0
- data/data/webgen/website_styles/1024px/src/images/background.gif +0 -0
- data/data/webgen/website_styles/andreas00/README +13 -0
- data/data/webgen/website_styles/andreas00/src/default.css +290 -0
- data/data/webgen/website_styles/andreas00/src/default.template +60 -0
- data/data/webgen/website_styles/andreas00/src/images/bg.gif +0 -0
- data/data/webgen/website_styles/andreas00/src/images/front.jpg +0 -0
- data/data/webgen/website_styles/andreas00/src/images/menubg.gif +0 -0
- data/data/webgen/website_styles/andreas00/src/images/menubg2.gif +0 -0
- data/data/webgen/website_styles/andreas01/README +14 -0
- data/data/webgen/website_styles/andreas01/src/default.css +310 -0
- data/data/webgen/website_styles/andreas01/src/default.template +62 -0
- data/data/webgen/website_styles/andreas01/src/images/bg.gif +0 -0
- data/data/webgen/website_styles/andreas01/src/images/front.jpg +0 -0
- data/data/webgen/website_styles/andreas01/src/print.css +35 -0
- data/data/webgen/website_styles/andreas03/README +14 -0
- data/data/webgen/website_styles/andreas03/src/default.css +223 -0
- data/data/webgen/website_styles/andreas03/src/default.template +58 -0
- data/data/webgen/website_styles/andreas03/src/images/bodybg.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/contbg.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/footerbg.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/gradient1.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/gradient2.png +0 -0
- data/data/webgen/website_styles/andreas04/README +15 -0
- data/data/webgen/website_styles/andreas04/src/default.css +290 -0
- data/data/webgen/website_styles/andreas04/src/default.template +81 -0
- data/data/webgen/website_styles/andreas04/src/images/blinkarrow.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/bodybg.png +0 -0
- data/data/webgen/website_styles/andreas04/src/images/contentbg.png +0 -0
- data/data/webgen/website_styles/andreas04/src/images/entrybg.png +0 -0
- data/data/webgen/website_styles/andreas04/src/images/flash.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/flash2.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/globe.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/globebottom.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/linkarrow.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/menuhover.png +0 -0
- data/data/webgen/website_styles/andreas05/README +14 -0
- data/data/webgen/website_styles/andreas05/src/default.css +33 -0
- data/data/webgen/website_styles/andreas05/src/default.template +40 -0
- data/data/webgen/website_styles/andreas05/src/images/bodybg.gif +0 -0
- data/data/webgen/website_styles/andreas05/src/images/front.png +0 -0
- data/data/webgen/website_styles/andreas06/README +14 -0
- data/data/webgen/website_styles/andreas06/src/default.css +354 -0
- data/data/webgen/website_styles/andreas06/src/default.template +70 -0
- data/data/webgen/website_styles/andreas06/src/images/bodybg.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/boxbg.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/greypx.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/header.jpg +0 -0
- data/data/webgen/website_styles/andreas06/src/images/innerbg.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/leaves.jpg +0 -0
- data/data/webgen/website_styles/andreas06/src/images/tabs.gif +0 -0
- data/data/webgen/website_styles/andreas07/README +15 -0
- data/data/webgen/website_styles/andreas07/src/browserfix.css +7 -0
- data/data/webgen/website_styles/andreas07/src/default.css +92 -0
- data/data/webgen/website_styles/andreas07/src/default.template +42 -0
- data/data/webgen/website_styles/andreas07/src/images/bodybg.gif +0 -0
- data/data/webgen/website_styles/andreas07/src/images/sidebarbg.gif +0 -0
- data/data/webgen/website_styles/andreas08/README +14 -0
- data/data/webgen/website_styles/andreas08/src/default.css +224 -0
- data/data/webgen/website_styles/andreas08/src/default.template +51 -0
- data/data/webgen/website_styles/andreas09/README +14 -0
- data/data/webgen/website_styles/andreas09/src/default.css +308 -0
- data/data/webgen/website_styles/andreas09/src/default.template +68 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-black.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-green.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-orange.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-purple.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-red.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/footerbg.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-black.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-green.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-orange.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-purple.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-red.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover.jpg +0 -0
- data/data/webgen/website_styles/simple/README +6 -0
- data/data/webgen/website_styles/simple/src/default.css +84 -0
- data/data/webgen/website_styles/simple/src/default.template +36 -0
- data/data/webgen/website_templates/default/README +6 -0
- data/data/webgen/website_templates/default/src/index.page +8 -0
- data/data/webgen/website_templates/project/README +5 -0
- data/data/webgen/website_templates/project/src/about.page +12 -0
- data/data/webgen/website_templates/project/src/download.page +15 -0
- data/data/webgen/website_templates/project/src/features.page +8 -0
- data/data/webgen/website_templates/project/src/index.page +9 -0
- data/data/webgen/website_templates/project/src/screenshots.page +18 -0
- data/doc/contentprocessor.template +11 -0
- data/doc/contentprocessor/blocks.page +129 -0
- data/doc/contentprocessor/builder.page +80 -0
- data/doc/contentprocessor/erb.page +59 -0
- data/doc/contentprocessor/erubis.page +46 -0
- data/doc/contentprocessor/fragments.page +25 -0
- data/doc/contentprocessor/haml.page +47 -0
- data/doc/contentprocessor/maruku.page +41 -0
- data/doc/contentprocessor/rdiscount.page +37 -0
- data/doc/contentprocessor/rdoc.page +36 -0
- data/doc/contentprocessor/redcloth.page +39 -0
- data/doc/contentprocessor/sass.page +31 -0
- data/doc/contentprocessor/tags.page +73 -0
- data/doc/extensions.metainfo +29 -0
- data/doc/extensions.page +16 -0
- data/doc/extensions.template +17 -0
- data/doc/faq.page +219 -0
- data/doc/getting_started.page +135 -0
- data/doc/index.page +65 -0
- data/doc/manual.page +589 -0
- data/doc/reference_configuration.page +959 -0
- data/doc/reference_metainfo.page +222 -0
- data/doc/source/filesystem.page +39 -0
- data/doc/source/tararchive.page +40 -0
- data/doc/sourcehandler.template +21 -0
- data/doc/sourcehandler/copy.page +19 -0
- data/doc/sourcehandler/directory.page +27 -0
- data/doc/sourcehandler/feed.page +105 -0
- data/doc/sourcehandler/metainfo.page +41 -0
- data/doc/sourcehandler/page.page +14 -0
- data/doc/sourcehandler/sitemap.page +46 -0
- data/doc/sourcehandler/template.page +45 -0
- data/doc/sourcehandler/virtual.page +49 -0
- data/doc/tag.template +25 -0
- data/doc/tag/breadcrumbtrail.page +40 -0
- data/doc/tag/coderay.page +49 -0
- data/doc/tag/date.page +31 -0
- data/doc/tag/executecommand.page +26 -0
- data/doc/tag/includefile.page +32 -0
- data/doc/tag/langbar.page +44 -0
- data/doc/tag/link.page +44 -0
- data/doc/tag/menu.page +106 -0
- data/doc/tag/metainfo.page +29 -0
- data/doc/tag/relocatable.page +38 -0
- data/doc/tag/sitemap.page +31 -0
- data/doc/tag/tikz.page +158 -0
- data/doc/upgrading.page +139 -0
- data/doc/webgen_page_format.page +129 -0
- data/lib/webgen/blackboard.rb +78 -0
- data/lib/webgen/cache.rb +87 -0
- data/lib/webgen/cli.rb +124 -0
- data/lib/webgen/cli/apply_command.rb +64 -0
- data/lib/webgen/cli/create_command.rb +66 -0
- data/lib/webgen/cli/run_command.rb +22 -0
- data/lib/webgen/cli/utils.rb +88 -0
- data/lib/webgen/cli/webgui_command.rb +72 -0
- data/lib/webgen/common.rb +21 -0
- data/lib/webgen/common/sitemap.rb +83 -0
- data/lib/webgen/configuration.rb +153 -0
- data/lib/webgen/contentprocessor.rb +99 -0
- data/lib/webgen/contentprocessor/blocks.rb +60 -0
- data/lib/webgen/contentprocessor/builder.rb +30 -0
- data/lib/webgen/contentprocessor/context.rb +89 -0
- data/lib/webgen/contentprocessor/erb.rb +28 -0
- data/lib/webgen/contentprocessor/erubis.rb +40 -0
- data/lib/webgen/contentprocessor/fragments.rb +25 -0
- data/lib/webgen/contentprocessor/haml.rb +30 -0
- data/lib/webgen/contentprocessor/maruku.rb +20 -0
- data/lib/webgen/contentprocessor/rdiscount.rb +17 -0
- data/lib/webgen/contentprocessor/rdoc.rb +19 -0
- data/lib/webgen/contentprocessor/redcloth.rb +17 -0
- data/lib/webgen/contentprocessor/sass.rb +20 -0
- data/lib/webgen/contentprocessor/tags.rb +136 -0
- data/lib/webgen/coreext.rb +13 -0
- data/lib/webgen/default_config.rb +215 -0
- data/lib/webgen/languages.rb +589 -0
- data/lib/webgen/loggable.rb +25 -0
- data/lib/webgen/logger.rb +97 -0
- data/lib/webgen/node.rb +391 -0
- data/lib/webgen/output.rb +82 -0
- data/lib/webgen/output/filesystem.rb +69 -0
- data/lib/webgen/page.rb +153 -0
- data/lib/webgen/path.rb +194 -0
- data/lib/webgen/source.rb +54 -0
- data/lib/webgen/source/filesystem.rb +61 -0
- data/lib/webgen/source/resource.rb +44 -0
- data/lib/webgen/source/stacked.rb +55 -0
- data/lib/webgen/source/tararchive.rb +73 -0
- data/lib/webgen/sourcehandler.rb +226 -0
- data/lib/webgen/sourcehandler/base.rb +248 -0
- data/lib/webgen/sourcehandler/copy.rb +43 -0
- data/lib/webgen/sourcehandler/directory.rb +36 -0
- data/lib/webgen/sourcehandler/feed.rb +117 -0
- data/lib/webgen/sourcehandler/fragment.rb +68 -0
- data/lib/webgen/sourcehandler/memory.rb +43 -0
- data/lib/webgen/sourcehandler/metainfo.rb +128 -0
- data/lib/webgen/sourcehandler/page.rb +59 -0
- data/lib/webgen/sourcehandler/sitemap.rb +60 -0
- data/lib/webgen/sourcehandler/template.rb +66 -0
- data/lib/webgen/sourcehandler/virtual.rb +110 -0
- data/lib/webgen/tag.rb +27 -0
- data/lib/webgen/tag/base.rb +170 -0
- data/lib/webgen/tag/breadcrumbtrail.rb +70 -0
- data/lib/webgen/tag/coderay.rb +31 -0
- data/lib/webgen/tag/date.rb +18 -0
- data/lib/webgen/tag/executecommand.rb +30 -0
- data/lib/webgen/tag/includefile.rb +42 -0
- data/lib/webgen/tag/langbar.rb +52 -0
- data/lib/webgen/tag/link.rb +26 -0
- data/lib/webgen/tag/menu.rb +207 -0
- data/lib/webgen/tag/metainfo.rb +25 -0
- data/lib/webgen/tag/relocatable.rb +54 -0
- data/lib/webgen/tag/sitemap.rb +41 -0
- data/lib/webgen/tag/tikz.rb +119 -0
- data/lib/webgen/tree.rb +90 -0
- data/lib/webgen/version.rb +8 -0
- data/lib/webgen/webgentask.rb +152 -0
- data/lib/webgen/website.rb +342 -0
- data/lib/webgen/websiteaccess.rb +31 -0
- data/lib/webgen/websitemanager.rb +127 -0
- data/man/man1/webgen.1 +73 -0
- data/misc/default.css +384 -0
- data/misc/default.template +75 -0
- data/misc/htmldoc.metainfo +25 -0
- data/misc/htmldoc.virtual +5 -0
- data/misc/images/arrow.gif +0 -0
- data/misc/images/error.png +0 -0
- data/misc/images/headerbg.jpg +0 -0
- data/misc/images/important.png +0 -0
- data/misc/images/information.png +0 -0
- data/misc/images/quote.gif +0 -0
- data/misc/images/warning.png +0 -0
- data/setup.rb +1585 -0
- data/test/helper.rb +45 -0
- data/test/test_blackboard.rb +60 -0
- data/test/test_cache.rb +59 -0
- data/test/test_cli.rb +21 -0
- data/test/test_common.rb +18 -0
- data/test/test_common_sitemap.rb +58 -0
- data/test/test_configuration.rb +68 -0
- data/test/test_contentprocessor.rb +33 -0
- data/test/test_contentprocessor_blocks.rb +68 -0
- data/test/test_contentprocessor_builder.rb +23 -0
- data/test/test_contentprocessor_context.rb +40 -0
- data/test/test_contentprocessor_erb.rb +23 -0
- data/test/test_contentprocessor_erubis.rb +49 -0
- data/test/test_contentprocessor_fragments.rb +42 -0
- data/test/test_contentprocessor_haml.rb +23 -0
- data/test/test_contentprocessor_maruku.rb +29 -0
- data/test/test_contentprocessor_rdiscount.rb +17 -0
- data/test/test_contentprocessor_rdoc.rb +18 -0
- data/test/test_contentprocessor_redcloth.rb +15 -0
- data/test/test_contentprocessor_sass.rb +22 -0
- data/test/test_contentprocessor_tags.rb +99 -0
- data/test/test_languages.rb +67 -0
- data/test/test_loggable.rb +32 -0
- data/test/test_logger.rb +94 -0
- data/test/test_node.rb +367 -0
- data/test/test_output_filesystem.rb +60 -0
- data/test/test_page.rb +214 -0
- data/test/test_path.rb +165 -0
- data/test/test_source_filesystem.rb +76 -0
- data/test/test_source_resource.rb +28 -0
- data/test/test_source_stacked.rb +36 -0
- data/test/test_source_tararchive.rb +65 -0
- data/test/test_sourcehandler_base.rb +123 -0
- data/test/test_sourcehandler_copy.rb +47 -0
- data/test/test_sourcehandler_directory.rb +42 -0
- data/test/test_sourcehandler_feed.rb +77 -0
- data/test/test_sourcehandler_fragment.rb +69 -0
- data/test/test_sourcehandler_memory.rb +44 -0
- data/test/test_sourcehandler_metainfo.rb +118 -0
- data/test/test_sourcehandler_page.rb +65 -0
- data/test/test_sourcehandler_sitemap.rb +49 -0
- data/test/test_sourcehandler_template.rb +65 -0
- data/test/test_sourcehandler_virtual.rb +87 -0
- data/test/test_tag_base.rb +85 -0
- data/test/test_tag_breadcrumbtrail.rb +91 -0
- data/test/test_tag_coderay.rb +32 -0
- data/test/test_tag_date.rb +18 -0
- data/test/test_tag_executecommand.rb +41 -0
- data/test/test_tag_includefile.rb +50 -0
- data/test/test_tag_langbar.rb +72 -0
- data/test/test_tag_link.rb +69 -0
- data/test/test_tag_menu.rb +207 -0
- data/test/test_tag_metainfo.rb +19 -0
- data/test/test_tag_relocatable.rb +59 -0
- data/test/test_tag_sitemap.rb +47 -0
- data/test/test_tag_tikz.rb +69 -0
- data/test/test_tree.rb +70 -0
- data/test/test_webgentask.rb +23 -0
- data/test/test_website.rb +98 -0
- data/test/test_websiteaccess.rb +25 -0
- data/test/test_websitemanager.rb +70 -0
- metadata +613 -0
@@ -0,0 +1,129 @@
|
|
1
|
+
---
|
2
|
+
title: Webgen Page Format
|
3
|
+
---
|
4
|
+
## Webgen Page Format
|
5
|
+
|
6
|
+
The Webgen Page Format is a custom format designed primarily for page and template files. It
|
7
|
+
consists of an optional meta information block and one or more blocks of data; it is very simple and
|
8
|
+
easy to use.
|
9
|
+
|
10
|
+
## Structure
|
11
|
+
|
12
|
+
A file using the Webgen Page Format consists of one or more blocks which are the smallest units
|
13
|
+
recognized. Blocks are separated from each other through a line containing three dashes. This is
|
14
|
+
illustrated in the following examples which are all valid files in WebPage Format:
|
15
|
+
|
16
|
+
Example 1:
|
17
|
+
|
18
|
+
Here is a block!
|
19
|
+
|
20
|
+
Example 2:
|
21
|
+
|
22
|
+
This is one block of the file
|
23
|
+
---
|
24
|
+
This is another block.
|
25
|
+
|
26
|
+
Example 3:
|
27
|
+
|
28
|
+
Block 1
|
29
|
+
--- name:block2
|
30
|
+
Block 2
|
31
|
+
--- name:block3
|
32
|
+
Block 3...
|
33
|
+
|
34
|
+
If you want to use three dashes in a block but you don't want to end the block, you have to escape
|
35
|
+
them with a backslash character, like this:
|
36
|
+
|
37
|
+
Block 1
|
38
|
+
\---
|
39
|
+
still Block 1
|
40
|
+
--- name:block2
|
41
|
+
Block 2
|
42
|
+
|
43
|
+
All of the above examples show one kind of block, the content block. However, there may also be
|
44
|
+
another type of block: the meta information block. Following is a short description of both kinds,
|
45
|
+
starting with the meta information block.
|
46
|
+
|
47
|
+
|
48
|
+
### Meta Information Block
|
49
|
+
|
50
|
+
Each file in Webgen Page Format can have zero or one meta information blocks. This block is
|
51
|
+
specified at the beginning of the file. To tell the parser that the first block is the meta
|
52
|
+
information block and not a content block, you have to start the file with three dashes:
|
53
|
+
|
54
|
+
---
|
55
|
+
title: The title set by Meta info
|
56
|
+
---
|
57
|
+
This is the content of the file
|
58
|
+
|
59
|
+
The above defines a meta information block and a content block. The meta information block has to be
|
60
|
+
in YAML format and should contain key-value pairs of meta information. [YAML](http://www.yaml.org)
|
61
|
+
is a simple markup language designed for ease of use and although you define structured data with
|
62
|
+
it, it feels like just writing a plain text document.
|
63
|
+
|
64
|
+
|
65
|
+
### Content Blocks
|
66
|
+
|
67
|
+
A content block is used to provide content in a specific format. Each file in Webgen Page Format
|
68
|
+
needs to have at least one content block which may be empty. However, it can have as many content
|
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:
|
81
|
+
|
82
|
+
* you either specify the name and additional options of the block on the starting line with the
|
83
|
+
three dashes
|
84
|
+
|
85
|
+
* or you use the special meta information `block` to define the names and options of one or all
|
86
|
+
blocks.
|
87
|
+
|
88
|
+
The following example uses the first technique to override the name and/or the `pipeline` option:
|
89
|
+
|
90
|
+
1. content block of the file
|
91
|
+
--- name:sidebar pipeline:maruku,tags
|
92
|
+
2. content block of the file
|
93
|
+
--- name:other
|
94
|
+
3. content block of the file
|
95
|
+
|
96
|
+
The first block has no identifieres set (there is no line with three dashes and the identifieres).
|
97
|
+
Therefore the default value for the name is used: `content`. The second block is named `sidebar` and
|
98
|
+
uses the processing pipeline `maruku,tags`. As you can see, the name of a block as well as
|
99
|
+
additional options are specified by stating the key (e.g. `name` or `pipeline`) followed by a colon
|
100
|
+
and the value. Multiple options are separated via one or more spaces. The value of a block option is
|
101
|
+
parsed with YAML. For example, when specifying `use_something:true` the value `true` is
|
102
|
+
automatically converted from the string `true` to the boolean `true`.
|
103
|
+
|
104
|
+
> Only the first block gets the default name of `content`. The second and following blocks have
|
105
|
+
> numbered names like `block2`, `block3` and so on.
|
106
|
+
{.information}
|
107
|
+
|
108
|
+
You can also set the name and additional options of the content blocks by using the special `blocks`
|
109
|
+
meta information. It is a hash using the index of a block (or the special value `default`) as key
|
110
|
+
and the options as values. The above example can therefore also be written like this:
|
111
|
+
|
112
|
+
---
|
113
|
+
blocks: \{2: {name: sidebar, pipeline: maruku,tags}, 3: {name: other}}
|
114
|
+
---
|
115
|
+
1. content block of the file
|
116
|
+
---
|
117
|
+
2. content block of the file
|
118
|
+
---
|
119
|
+
3. content block of the file
|
120
|
+
|
121
|
+
When selecting a value for the name of a block or an option, the following precedence is used (from
|
122
|
+
low to high):
|
123
|
+
|
124
|
+
* global defaults set via the `default` key of the meta information `blocks`
|
125
|
+
* block defaults set via the meta information `blocks`
|
126
|
+
* the `--- line` options
|
127
|
+
|
128
|
+
As stated above, the "option" `name` is special insofar that when it is not set, an automatic name
|
129
|
+
gets generated.
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
module Webgen
|
4
|
+
|
5
|
+
# A blackboard object provides two features for inter-object communication:
|
6
|
+
#
|
7
|
+
# * *services*: An object can add a service to the blackboard which can be called by any other
|
8
|
+
# object by just specifing the service name. Therefore it is easy to change the underlying
|
9
|
+
# implementation of the service and there are no hard dependencies on specific class or method
|
10
|
+
# names.
|
11
|
+
#
|
12
|
+
# * *listeners*: Objects may register themselves for specific messsage names and get notified when
|
13
|
+
# such a message gets dispatched.
|
14
|
+
#
|
15
|
+
# For a list of all available services and messages have a look at the main Webgen documentation
|
16
|
+
# page.
|
17
|
+
class Blackboard
|
18
|
+
|
19
|
+
# Create a new Blackboard object.
|
20
|
+
def initialize
|
21
|
+
@listener = {}
|
22
|
+
@services = {}
|
23
|
+
end
|
24
|
+
|
25
|
+
# Add the +callable_object+ or the given block as listener for the messages +msg_names+ (one
|
26
|
+
# message name or an array of message names).
|
27
|
+
def add_listener(msg_names = nil, callable_object = nil, &block)
|
28
|
+
callable_object = callable_object || block
|
29
|
+
if !callable_object.nil?
|
30
|
+
raise ArgumentError, "The listener needs to respond to 'call'" unless callable_object.respond_to?(:call)
|
31
|
+
[msg_names].flatten.compact.each {|name| (@listener[name] ||= []) << callable_object}
|
32
|
+
else
|
33
|
+
raise ArgumentError, "You have to provide a callback object or a block"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
# Remove the given object from the dispatcher queues of the message names specified in
|
38
|
+
# +msg_names+.
|
39
|
+
def del_listener(msg_names, callable_object)
|
40
|
+
[msg_names].flatten.each {|name| @listener[name].delete(callable_object) if @listener[name]}
|
41
|
+
end
|
42
|
+
|
43
|
+
# Dispatch the message +msg_name+ to all listeners for this message, passing the given
|
44
|
+
# arguments.
|
45
|
+
def dispatch_msg(msg_name, *args)
|
46
|
+
return unless @listener[msg_name]
|
47
|
+
@listener[msg_name].each {|obj| obj.call(*args)}
|
48
|
+
end
|
49
|
+
|
50
|
+
# Add a service named +service_name+ provided by the +callable_object+ or a block to the
|
51
|
+
# blackboard.
|
52
|
+
def add_service(service_name, callable_object = nil, &block)
|
53
|
+
callable_object = callable_object || block
|
54
|
+
if @services.has_key?(service_name)
|
55
|
+
raise "The service name '#{service_name}' is already taken"
|
56
|
+
else
|
57
|
+
raise ArgumentError, "An object providing a service needs to respond to 'call'" unless callable_object.respond_to?(:call)
|
58
|
+
@services[service_name] = callable_object
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Delete the service +service_name+.
|
63
|
+
def del_service(service_name)
|
64
|
+
@services.delete(service_name)
|
65
|
+
end
|
66
|
+
|
67
|
+
# Invoke the service called +service_name+ with the given arguments.
|
68
|
+
def invoke(service_name, *args, &block)
|
69
|
+
if @services.has_key?(service_name)
|
70
|
+
@services[service_name].call(*args, &block)
|
71
|
+
else
|
72
|
+
raise ArgumentError, "No such service named '#{service_name}' available"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
data/lib/webgen/cache.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'set'
|
4
|
+
require 'facets/kernel/constant'
|
5
|
+
|
6
|
+
module Webgen
|
7
|
+
|
8
|
+
# A cache object provides access to various caches to speed up rendering of a website:
|
9
|
+
#
|
10
|
+
# [permanent] The permanent cache should be used for data that should be available between webgen
|
11
|
+
# runs.
|
12
|
+
#
|
13
|
+
# [volatile] The volatile cache is used for data that can easily be regenerated but might be
|
14
|
+
# expensive to do so. This cache is not stored between webgen runs.
|
15
|
+
#
|
16
|
+
# [standard] The standard cache saves data between webgen runs and returns the cached data (not
|
17
|
+
# the newly set data) if it is available. This is useful, for example, to store file
|
18
|
+
# modifcation times and check if a file has been changed between runs.
|
19
|
+
#
|
20
|
+
# The standard cache should be accessed through the <tt>[]</tt> method which returns the correct
|
21
|
+
# value and the <tt>[]=</tt> method should be used for setting the new value. However, if you
|
22
|
+
# really need to access a particular value of the old or new standard cache, you can use the
|
23
|
+
# accessors +old_data+ and +new_data+.
|
24
|
+
class Cache
|
25
|
+
|
26
|
+
# The permanent cache hash.
|
27
|
+
attr_reader :permanent
|
28
|
+
|
29
|
+
# The volatile cache hash.
|
30
|
+
attr_reader :volatile
|
31
|
+
|
32
|
+
# The cache data stored in the previous webgen run.
|
33
|
+
attr_reader :old_data
|
34
|
+
|
35
|
+
# The cache data stored in the current webgen run.
|
36
|
+
attr_reader :new_data
|
37
|
+
|
38
|
+
# Create a new cache object.
|
39
|
+
def initialize()
|
40
|
+
@old_data = {}
|
41
|
+
@new_data = {}
|
42
|
+
@volatile = {}
|
43
|
+
@permanent = {:classes => []}
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return the cached data (or, if it is not available, the new data) identified by +key+ from the
|
47
|
+
# standard cache.
|
48
|
+
def [](key)
|
49
|
+
if @old_data.has_key?(key)
|
50
|
+
@old_data[key]
|
51
|
+
else
|
52
|
+
@new_data[key]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Store +value+ identified by +key+ in the standard cache.
|
57
|
+
def []=(key, value)
|
58
|
+
@new_data[key] = value
|
59
|
+
end
|
60
|
+
|
61
|
+
# Restore the caches from +data+ and recreate all cached instances (see #instance).
|
62
|
+
def restore(data)
|
63
|
+
@old_data, @permanent = *data
|
64
|
+
@permanent[:classes].each {|klass| instance(klass)}
|
65
|
+
end
|
66
|
+
|
67
|
+
# Return all caches that should be available between webgen runs.
|
68
|
+
def dump
|
69
|
+
[@old_data.merge(@new_data), @permanent]
|
70
|
+
end
|
71
|
+
|
72
|
+
# Reset the volatile cache.
|
73
|
+
def reset_volatile_cache
|
74
|
+
@volatile = {:classes => @volatile[:classes]}
|
75
|
+
end
|
76
|
+
|
77
|
+
# Return the unique instance of the class +name+. This method should be used when it is
|
78
|
+
# essential that webgen uses only one object of a class or when an object should automatically
|
79
|
+
# be recreated upon cache restoration (see #restore).
|
80
|
+
def instance(name)
|
81
|
+
@permanent[:classes] << name unless @permanent[:classes].include?(name)
|
82
|
+
(@volatile[:classes] ||= {})[name] ||= constant(name).new
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/lib/webgen/cli.rb
ADDED
@@ -0,0 +1,124 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'cmdparse'
|
4
|
+
require 'webgen/website'
|
5
|
+
require 'webgen/version'
|
6
|
+
|
7
|
+
module Webgen
|
8
|
+
|
9
|
+
# Namespace for all classes that act as CLI commands.
|
10
|
+
#
|
11
|
+
# == Implementing a CLI command
|
12
|
+
#
|
13
|
+
# Each CLI command class needs to be put into this module and has to end with +Command+, otherwise
|
14
|
+
# it is not used. A CLI command is an extension that can be invoked from the webgen command and
|
15
|
+
# thus needs to be derived from CmdParse::Command. For detailed information on this class and the
|
16
|
+
# whole cmdparse package have a look at http://cmdparse.rubyforge.org!
|
17
|
+
#
|
18
|
+
# == Sample CLI command
|
19
|
+
#
|
20
|
+
# Here is a sample CLI command extension:
|
21
|
+
#
|
22
|
+
# require 'webgen/cli'
|
23
|
+
#
|
24
|
+
# class Webgen::CLI::SampleCommand < CmdParse::Command
|
25
|
+
#
|
26
|
+
# def initialize
|
27
|
+
# super('sample', false)
|
28
|
+
# self.short_desc = "This sample command just outputs its parameters"
|
29
|
+
# self.description = Utils.format("Uses the global verbosity level and outputs additional " +
|
30
|
+
# "information when the level is set to verbose!")
|
31
|
+
# @username = nil
|
32
|
+
# self.options = CmdParse::OptionParserWrapper.new do |opts|
|
33
|
+
# opts.separator "Options:"
|
34
|
+
# opts.on('-u', '--user USER', String,
|
35
|
+
# 'Specify an additional user name to output') {|@username|}
|
36
|
+
# end
|
37
|
+
# end
|
38
|
+
#
|
39
|
+
# def execute(args)
|
40
|
+
# if args.length == 0
|
41
|
+
# raise OptionParser::MissingArgument.new('ARG1 [ARG2 ...]')
|
42
|
+
# else
|
43
|
+
# puts "Command line arguments:"
|
44
|
+
# args.each {|arg| puts arg}
|
45
|
+
# if commandparser.verbosity == :verbose
|
46
|
+
# puts "Yeah, some additional information is always cool!"
|
47
|
+
# end
|
48
|
+
# puts "The entered username: #{@username}" if @username
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# end
|
53
|
+
#
|
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!
|
56
|
+
#
|
57
|
+
# For information about which attributes are available on the webgen command parser instance have
|
58
|
+
# a look at Webgen::CLI::CommandParser!
|
59
|
+
module CLI
|
60
|
+
|
61
|
+
autoload :RunCommand, 'webgen/cli/run_command'
|
62
|
+
autoload :CreateCommand, 'webgen/cli/create_command'
|
63
|
+
autoload :WebguiCommand, 'webgen/cli/webgui_command'
|
64
|
+
autoload :ApplyCommand, 'webgen/cli/apply_command'
|
65
|
+
|
66
|
+
autoload :Utils, 'webgen/cli/utils'
|
67
|
+
|
68
|
+
|
69
|
+
# This is the command parser class used for handling the webgen command line interface. After
|
70
|
+
# creating an instance, the inherited #parse method can be used for parsing the command line
|
71
|
+
# arguments and executing the requested command.
|
72
|
+
class CommandParser < CmdParse::CommandParser
|
73
|
+
|
74
|
+
# The website directory. Default: the current working directory.
|
75
|
+
attr_reader :directory
|
76
|
+
|
77
|
+
# The verbosity level. Default: <tt>:normal</tt>
|
78
|
+
attr_reader :verbosity
|
79
|
+
|
80
|
+
# The log level. Default: <tt>Logger::WARN</tt>
|
81
|
+
attr_reader :log_level
|
82
|
+
|
83
|
+
# Create a new CommandParser class. The default webgen website (if not specified via the
|
84
|
+
# <tt>-d</tt> option) is taken from the environment variable +WEBGEN_WEBSITE+ or, if it is not
|
85
|
+
# set or empty, the current working directory.
|
86
|
+
def initialize # :nodoc:
|
87
|
+
super(true)
|
88
|
+
@directory = (ENV['WEBGEN_WEBSITE'].to_s.empty? ? Dir.pwd : ENV['WEBGEN_WEBSITE'])
|
89
|
+
@verbosity = :normal
|
90
|
+
@log_level = ::Logger::WARN
|
91
|
+
@log_filter = nil
|
92
|
+
|
93
|
+
self.program_name = "webgen"
|
94
|
+
self.program_version = Webgen::VERSION
|
95
|
+
self.options = CmdParse::OptionParserWrapper.new do |opts|
|
96
|
+
opts.separator "Global options:"
|
97
|
+
opts.on("--directory DIR", "-d", String, "The website directory (default: the current directory)") {|p| @directory = p}
|
98
|
+
opts.on("--verbose", "-v", "Print more output") { @verbosity = :verbose }
|
99
|
+
opts.on("--quiet", "-q", "No output") { @verbosity = :quiet }
|
100
|
+
opts.on("--log-level LEVEL", "-l", Integer, "The logging level (0..debug, 3..error)") {|p| @log_level = p}
|
101
|
+
opts.on("--log-filter", "-f", Regexp, 'Filter for logging events') {|p| @log_filter = p}
|
102
|
+
end
|
103
|
+
self.add_command(CmdParse::HelpCommand.new)
|
104
|
+
self.add_command(CmdParse::VersionCommand.new)
|
105
|
+
Webgen::CLI.constants.select {|c| c =~ /.+Command$/ }.each do |c|
|
106
|
+
self.add_command(Webgen::CLI.const_get(c).new, (c.to_s == 'RunCommand' ? true : false))
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
# Utility method for sub-commands to create the correct Webgen::Website object.
|
111
|
+
def create_website
|
112
|
+
website = Webgen::Website.new(@directory) do |config|
|
113
|
+
config['logger.mask'] = @log_filter
|
114
|
+
end
|
115
|
+
website.logger.level = @log_level
|
116
|
+
website.logger.verbosity = @verbosity
|
117
|
+
website
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
@@ -0,0 +1,64 @@
|
|
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 style 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 style 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 + "STYLE: the style the should be applied to the website"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def usage # :nodoc:
|
28
|
+
"Usage: #{commandparser.program_name} [global options] apply [options] STYLE"
|
29
|
+
end
|
30
|
+
|
31
|
+
def show_help # :nodoc:
|
32
|
+
super
|
33
|
+
wm = Webgen::WebsiteManager.new(commandparser.directory)
|
34
|
+
|
35
|
+
puts
|
36
|
+
puts "Available styles:"
|
37
|
+
puts Utils.headline('Styles')
|
38
|
+
wm.styles.sort.each {|name, entry| Utils.hash_output(name, entry.instance_eval { @table }) }
|
39
|
+
end
|
40
|
+
|
41
|
+
# Apply the style specified in <tt>args[0]</tt> to the webgen website.
|
42
|
+
def execute(args)
|
43
|
+
wm = Webgen::WebsiteManager.new(commandparser.directory)
|
44
|
+
if !File.directory?(commandparser.directory)
|
45
|
+
puts "You need to specify a valid webgen website directory!"
|
46
|
+
elsif args.length == 0
|
47
|
+
raise OptionParser::MissingArgument.new('STYLE')
|
48
|
+
elsif !wm.styles.has_key?(args[0])
|
49
|
+
raise OptionParser::InvalidArgument.new("#{args[0]} is not a valid style")
|
50
|
+
else
|
51
|
+
puts "The following files in the website directory will be created or overwritten:"
|
52
|
+
puts wm.styles[args[0]].paths.to_a.sort.join("\n")
|
53
|
+
continue = @force
|
54
|
+
if !continue
|
55
|
+
print "Procede? (yes/no): "
|
56
|
+
continue = ($stdin.readline =~ /y(es)?/)
|
57
|
+
end
|
58
|
+
wm.apply_style(args[0]) if continue
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|