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.
- 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
|