gettalong-webgen 0.5.5.20081010 → 0.5.5.20081012
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/doc/contentprocessor/fragments.page +25 -0
- data/doc/manual.page +33 -15
- data/doc/reference_configuration.page +13 -0
- data/doc/reference_metainfo.page +11 -2
- data/doc/sourcehandler/feed.page +19 -4
- data/doc/sourcehandler/page.page +0 -16
- data/doc/tag/langbar.page +8 -1
- data/lib/webgen/contentprocessor.rb +1 -0
- data/lib/webgen/contentprocessor/fragments.rb +23 -0
- data/lib/webgen/default_config.rb +3 -1
- data/lib/webgen/languages.rb +9 -0
- data/lib/webgen/logger.rb +18 -1
- data/lib/webgen/node.rb +1 -1
- data/lib/webgen/page.rb +1 -1
- data/lib/webgen/sourcehandler.rb +3 -0
- data/lib/webgen/sourcehandler/feed.rb +3 -6
- data/lib/webgen/sourcehandler/page.rb +0 -16
- data/lib/webgen/tag/langbar.rb +1 -1
- data/lib/webgen/tree.rb +2 -1
- data/test/test_contentprocessor_fragments.rb +40 -0
- data/test/test_languages.rb +12 -0
- data/test/test_logger.rb +19 -0
- data/test/test_node.rb +1 -0
- data/test/test_page.rb +2 -2
- data/test/test_sourcehandler_feed.rb +3 -1
- data/test/test_sourcehandler_page.rb +0 -5
- data/test/test_tag_langbar.rb +7 -1
- data/test/test_tree.rb +4 -2
- metadata +5 -2
@@ -0,0 +1,25 @@
|
|
1
|
+
---
|
2
|
+
title: Webgen::ContentProcessor::Fragments
|
3
|
+
---
|
4
|
+
## Description
|
5
|
+
|
6
|
+
This processor generates nested fragment nodes from all headers `h1` to `h6` which have an `id`
|
7
|
+
attribute set.
|
8
|
+
|
9
|
+
> This is only done for the block named `content` or if no block is associated with the given render
|
10
|
+
> context! This is to ensure that fragment nodes are not created from multiple block of one page
|
11
|
+
> file. So this content processor has no effect when used in the pipeline of blocks except if the
|
12
|
+
> block is named `content`.
|
13
|
+
{.exclamation}
|
14
|
+
|
15
|
+
The default markup language Maruku automatically generates an `id` attribute for all headers. If you
|
16
|
+
use another markup language or plain old HTML, you might need to set the `id` attributes by hand.
|
17
|
+
|
18
|
+
> The reason why only header tags with an `id` attribute are used is that only those can be
|
19
|
+
> referenced and linked to later.
|
20
|
+
{.information}
|
21
|
+
|
22
|
+
The generated fragment nodes can be used like any other node. So you can link to them and use them
|
23
|
+
in a menu. Concerning the menu, there is a setting for the `tag.menu.used_nodes` option called
|
24
|
+
`fragments` which only uses the fragment node of the current page to generate a menu. This allows to
|
25
|
+
generate a nice overview of the page.
|
data/doc/manual.page
CHANGED
@@ -429,21 +429,6 @@ As you might have deduced from the processing list above, it is possible that on
|
|
429
429
|
multiple source handlers. This can be used, for example, to render an XML file as HTML and copy it
|
430
430
|
verbatim.
|
431
431
|
|
432
|
-
Internally a tree structure is created reflecting the source directory hierarchy and each path that
|
433
|
-
is handled by webgen. Normally a source handler creates one node from one path but it is also
|
434
|
-
possible that a source handler creates multiple nodes from one path.
|
435
|
-
|
436
|
-
> The name used for describing a directory or file once it is placed in the internal tree structure
|
437
|
-
> is 'node'.
|
438
|
-
{.information}
|
439
|
-
|
440
|
-
After this internal tree structure is created, it is traversed and each node is processed. First the
|
441
|
-
node is checked if has changed (the notion of 'changed' depends on many things but a node is
|
442
|
-
changed, for example, if its meta information or the associated source path has changed since the
|
443
|
-
last webgen run). If it has not changed, nothing needs to be written. Otherwise, the information
|
444
|
-
needed to write out the node is gathered and its content is written to the output path represented
|
445
|
-
by the node.
|
446
|
-
|
447
432
|
|
448
433
|
## Path Meta Information {#source-metainfo}
|
449
434
|
|
@@ -521,6 +506,39 @@ There are several types of extensions:
|
|
521
506
|
|
522
507
|
|
523
508
|
|
509
|
+
# A webgen Run
|
510
|
+
|
511
|
+
When webgen is started, it first looks for a cache file and uses it if it exists. The cache file
|
512
|
+
provides information on the previous run and allows webgen to render only those paths that have
|
513
|
+
changed since the last time.
|
514
|
+
|
515
|
+
Each webgen run consists of one or more update/write cycles. During the update phase the internal
|
516
|
+
tree structure is updated to reflect the current situation:
|
517
|
+
|
518
|
+
* Nodes are created from newly found source paths.
|
519
|
+
* If a source path was deleted since the last webgen run, the nodes created from it will be deleted.
|
520
|
+
* All nodes in the tree are checked if they have changed and, if so, are marked for regeneration.
|
521
|
+
|
522
|
+
> The name used for describing a directory or file once it is placed in the internal tree structure
|
523
|
+
> is 'node'.
|
524
|
+
{.information}
|
525
|
+
|
526
|
+
After the update cycle has finished, the internal tree representation is up-to-date and contains all
|
527
|
+
necessary information to write its nodes. This is done in the write phase which writes out all
|
528
|
+
changed nodes.
|
529
|
+
|
530
|
+
It is possible that the internal tree structure changes during the write phase. For example, after
|
531
|
+
writing a page file fragments node for it may have been generated. After the write phase it is
|
532
|
+
checked if something like this has happened. If webgen finds such a condition, a new update/write
|
533
|
+
cycle is initiated. This is done as long as needed.
|
534
|
+
|
535
|
+
Since it is possible that multiple update/write cycles are used in one webgen run, it is shown in
|
536
|
+
the log messages when a new cycle started. This is necessary because sometimes some warning or error
|
537
|
+
log messages may be generated during an earlier cycle but the error conditions are automatically
|
538
|
+
solved in later cycles. By marking where the cycles start a user can compare the log messages of the
|
539
|
+
different cycles and see what he needs to solve himself.
|
540
|
+
|
541
|
+
|
524
542
|
# Extending webgen
|
525
543
|
|
526
544
|
If you know the programming language Ruby a little bit, you can easily extend webgen and add new
|
@@ -550,6 +550,19 @@ files in Webgen Page Format.
|
|
550
550
|
Langbar with single language not shown: \{langbar: {show_single_lang: false}}
|
551
551
|
|
552
552
|
|
553
|
+
* ### tag.langbar.lang\_names
|
554
|
+
|
555
|
+
This configuration option can be used to specify the language names that should be displayed
|
556
|
+
instead of the language codes.
|
557
|
+
|
558
|
+
* Syntax: `\{CODE: NAME, ...}` where `CODE` is a language code and `NAME` the associated language
|
559
|
+
name of the code.
|
560
|
+
|
561
|
+
* Examples:
|
562
|
+
|
563
|
+
Langbar with custom language names: \{langbar: {lang_names: {de: Deutsch, en: English}}}
|
564
|
+
|
565
|
+
|
553
566
|
* ### tag.menu.used\_nodes
|
554
567
|
|
555
568
|
Specifies the type of nodes that should be used for menu generation. If `all` is specified then
|
data/doc/reference_metainfo.page
CHANGED
@@ -60,6 +60,10 @@ never`.
|
|
60
60
|
Sets the time when the path was created. This information cannot automatically be derived for paths
|
61
61
|
provided by Webgen::Source::FileSystem, so this has to be set manually.
|
62
62
|
|
63
|
+
> Note that the value needs to be a valid [YAML timestamp](http://yaml.org/type/timestamp.html) and
|
64
|
+
> needs to include the time part.
|
65
|
+
{.information}
|
66
|
+
|
63
67
|
### draft
|
64
68
|
|
65
69
|
{:miref}
|
@@ -127,8 +131,13 @@ path.
|
|
127
131
|
* Any
|
128
132
|
|
129
133
|
Sets the time when the path was last modified. This information is automatically set for paths
|
130
|
-
provided by Webgen::Source::FileSystem but can be overridden by
|
131
|
-
valid time, the time when webgen is executed is used for this
|
134
|
+
provided by Webgen::Source::FileSystem (the file modification is used) but can be overridden by
|
135
|
+
setting it manually. If not set to a valid time, the time when webgen is executed is used for this
|
136
|
+
meta information.
|
137
|
+
|
138
|
+
> Note that the value needs to be a valid [YAML timestamp](http://yaml.org/type/timestamp.html) and
|
139
|
+
> needs to include the time part.
|
140
|
+
{.information}
|
132
141
|
|
133
142
|
### no\_output
|
134
143
|
|
data/doc/sourcehandler/feed.page
CHANGED
@@ -14,6 +14,11 @@ The following meta information keys are supported:
|
|
14
14
|
A LCN pattern (or an array of LCN patterns) which specify the page files that should be
|
15
15
|
used. Other matched files are excluded from the list.
|
16
16
|
|
17
|
+
> Be aware that if you want to include a single file or files in a specific language only you
|
18
|
+
> need to include the language part since this is a LCN and not a CN pattern, eg. `mypage.html`
|
19
|
+
> won't work but `mypage.en.html` will!
|
20
|
+
{.information}
|
21
|
+
|
17
22
|
* `number_of_entries` (OPTIONAL)
|
18
23
|
|
19
24
|
The number of entries that should be included in the feed. Defaults to 10.
|
@@ -26,6 +31,10 @@ The following meta information keys are supported:
|
|
26
31
|
|
27
32
|
A RSS feed is generated if this key is set to `true`. Defaults to `true`.
|
28
33
|
|
34
|
+
* `rss_version` (OPTIONAL)
|
35
|
+
|
36
|
+
The RSS version that should be used for generating the RSS feed. Defaults to `2.0`.
|
37
|
+
|
29
38
|
* `site_url` (MANDATORY)
|
30
39
|
|
31
40
|
The base url of the website for which the feed is generated.
|
@@ -48,11 +57,14 @@ The following meta information keys are supported:
|
|
48
57
|
|
49
58
|
* `created_at` (OPTIONAL)
|
50
59
|
|
51
|
-
The time at which this feed was created. Defaults to the current time if not set.
|
60
|
+
The time at which this feed was created. Defaults to the current time if not set. Has the same
|
61
|
+
format as the meta information `created_at`.
|
52
62
|
|
53
|
-
* `
|
63
|
+
* `content_block_name` (OPTIONAL)
|
54
64
|
|
55
|
-
The
|
65
|
+
The name of the block that should be used for the content of the feed entries. If not specified
|
66
|
+
the name `content` is used. Be aware that each page file that can appear in the feed needs to
|
67
|
+
have such a block!
|
56
68
|
|
57
69
|
The following meta information keys of page files are used if they are specified:
|
58
70
|
|
@@ -65,6 +77,9 @@ The following meta information keys of page files are used if they are specified
|
|
65
77
|
The time at which the page file was last modified, used as the time at which this feed entry was
|
66
78
|
updated.
|
67
79
|
|
80
|
+
> This is the field that is used to sort the entries.
|
81
|
+
{.information}
|
82
|
+
|
68
83
|
* `title`
|
69
84
|
|
70
85
|
The title of the page file, used as title of the feed entry.
|
@@ -79,4 +94,4 @@ The following meta information keys of page files are used if they are specified
|
|
79
94
|
|
80
95
|
The default implementation supports the generation of atom and RSS feeds. You can override the
|
81
96
|
default generation mechanism by adding an `atom_template` and/or `rss_template` block in the feed
|
82
|
-
file which are then used to generate the atom or the RSS feed respectively.
|
97
|
+
file which are then used to generate the atom or the RSS feed respectively.
|
data/doc/sourcehandler/page.page
CHANGED
@@ -12,19 +12,3 @@ meta information.
|
|
12
12
|
set, the default language specified using the configuration option `website.lang` is used. This
|
13
13
|
means that for the default language set to English and a source path named `index.page`, the
|
14
14
|
language meta information is automatically set to English.
|
15
|
-
|
16
|
-
## Fragment nodes
|
17
|
-
|
18
|
-
The page handler automatically generates fragment nodes for all found header tags in the block named
|
19
|
-
`content` (i.e. `h1`, `h2`, ...) that have an `id` attribute set. The default markup language Maruku
|
20
|
-
automatically generates an `id` attribute for all headers. If you use another markup language or
|
21
|
-
plain old HTML, you might need to set the `id` attributes by hand.
|
22
|
-
|
23
|
-
> The reason why only header tags with an `id` attribute are used is that only those can be
|
24
|
-
> referenced and linked to later.
|
25
|
-
{.information}
|
26
|
-
|
27
|
-
The generated fragment nodes can be used like any other node. So you can link to them and use them
|
28
|
-
in a menu. Concerning the menu, there is a setting for the `tag.menu.used_nodes` option called
|
29
|
-
`fragments` which only uses the fragment node of the current page to generate a menu. This allows to
|
30
|
-
generate a nice overview of the page.
|
data/doc/tag/langbar.page
CHANGED
@@ -4,10 +4,13 @@ used_options:
|
|
4
4
|
- tag.langbar.separator
|
5
5
|
- tag.langbar.show_own_lang
|
6
6
|
- tag.langbar.show_single_lang
|
7
|
+
- tag.langbar.lang_names
|
7
8
|
---
|
8
9
|
## Description
|
9
10
|
|
10
|
-
This tag is used to display a list of links to translations of the page.
|
11
|
+
This tag is used to display a list of links to translations of the page. The text that is displayed
|
12
|
+
can be set via the configuration option `tag.langbar.lang_names` (if not set, the language code is
|
13
|
+
shown).
|
11
14
|
|
12
15
|
## Examples
|
13
16
|
|
@@ -19,4 +22,8 @@ This tag is used to display a list of links to translations of the page.
|
|
19
22
|
<td>\{langbar:}</td>
|
20
23
|
<td>{langbar:}</td>
|
21
24
|
</tr>
|
25
|
+
<tr>
|
26
|
+
<td>\{langbar: {lang_names: {en: Englisch}}}</td>
|
27
|
+
<td>{langbar: {lang_names: {en: Englisch}}}</td>
|
28
|
+
</tr>
|
22
29
|
</table>
|
@@ -65,6 +65,7 @@ module Webgen
|
|
65
65
|
autoload :Builder, 'webgen/contentprocessor/builder'
|
66
66
|
autoload :Erubis, 'webgen/contentprocessor/erubis'
|
67
67
|
autoload :RDiscount, 'webgen/contentprocessor/rdiscount'
|
68
|
+
autoload :Fragments, 'webgen/contentprocessor/fragments'
|
68
69
|
|
69
70
|
# Return the list of all available content processors.
|
70
71
|
def self.list
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Webgen::ContentProcessor
|
2
|
+
|
3
|
+
# Uses the HTML headers h1, h2, ..., h6 to generate nested fragment nodes.
|
4
|
+
class Fragments
|
5
|
+
|
6
|
+
include Webgen::WebsiteAccess
|
7
|
+
|
8
|
+
# Generate the nested fragment nodes from <tt>context.content</tt> under
|
9
|
+
# <tt>content.content_node</tt> but only if there is no associated <tt>:block</tt> data in
|
10
|
+
# +context+ or the block is named +content+.
|
11
|
+
def call(context)
|
12
|
+
if !context[:block] || context[:block].name == 'content'
|
13
|
+
sections = website.blackboard.invoke(:parse_html_headers, context.content)
|
14
|
+
website.blackboard.invoke(:create_fragment_nodes, sections, context.content_node,
|
15
|
+
website.blackboard.invoke(:source_paths)[context.content_node.node_info[:src]],
|
16
|
+
context.content_node.meta_info['fragments_in_menu'])
|
17
|
+
end
|
18
|
+
context
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
@@ -80,7 +80,7 @@ config.sourcehandler.default_meta_info({
|
|
80
80
|
'Webgen::SourceHandler::Page' => {
|
81
81
|
'kind' => 'page',
|
82
82
|
'fragments_in_menu' => true,
|
83
|
-
'blocks' => {'default' => {'pipeline' => 'erb,tags,maruku,blocks'}}
|
83
|
+
'blocks' => {'default' => {'pipeline' => 'erb,tags,maruku,blocks,fragments'}}
|
84
84
|
},
|
85
85
|
'Webgen::SourceHandler::Fragment' => {
|
86
86
|
'kind' => 'fragment'
|
@@ -131,6 +131,7 @@ config.contentprocessor.map({
|
|
131
131
|
'builder' => 'Webgen::ContentProcessor::Builder',
|
132
132
|
'erubis' => 'Webgen::ContentProcessor::Erubis',
|
133
133
|
'rdiscount' => 'Webgen::ContentProcessor::RDiscount',
|
134
|
+
'fragments' => 'Webgen::ContentProcessor::Fragments',
|
134
135
|
}, :doc => 'Content processor name to class map')
|
135
136
|
|
136
137
|
Webgen::WebsiteAccess.website.blackboard.add_service(:content_processor_names, Webgen::ContentProcessor.method(:list))
|
@@ -172,6 +173,7 @@ config.tag.breadcrumbtrail.end_level(-1, :doc => 'The level at which the breadcr
|
|
172
173
|
config.tag.langbar.separator(' | ', :doc => 'Separates the languages from each other.')
|
173
174
|
config.tag.langbar.show_single_lang(true, :doc => 'Should the link be shown although the page is only available in one language?')
|
174
175
|
config.tag.langbar.show_own_lang(true, :doc => 'Should the link to the currently displayed language page be shown?')
|
176
|
+
config.tag.langbar.lang_names({}, :doc => 'A map from language code to language names')
|
175
177
|
|
176
178
|
config.tag.includefile.filename(nil, :doc => 'The name of the file which should be included (relative to the website).', :mandatory => 'default')
|
177
179
|
config.tag.includefile.process_output(true, :doc => 'The file content will be scanned for tags if true.')
|
data/lib/webgen/languages.rb
CHANGED
@@ -50,6 +50,15 @@ module Webgen
|
|
50
50
|
self.to_s <=> other.to_s
|
51
51
|
end
|
52
52
|
|
53
|
+
def eql?(other) #:nodoc:
|
54
|
+
(other.is_a?(self.class) && other.to_s == self.to_s) ||
|
55
|
+
(other.is_a?(String) && self.to_s == other)
|
56
|
+
end
|
57
|
+
|
58
|
+
def hash #:nodoc:
|
59
|
+
self.to_s.hash
|
60
|
+
end
|
61
|
+
|
53
62
|
end
|
54
63
|
|
55
64
|
|
data/lib/webgen/logger.rb
CHANGED
@@ -27,11 +27,28 @@ module Webgen
|
|
27
27
|
end
|
28
28
|
self.level = ::Logger::WARN
|
29
29
|
self.verbosity = :normal
|
30
|
+
@marks = []
|
30
31
|
end
|
31
32
|
|
32
33
|
# Returns the output of the logger when #sync is +false+. Otherwise an empty string is returned.
|
33
34
|
def log_output
|
34
|
-
@sync
|
35
|
+
if @sync
|
36
|
+
''
|
37
|
+
else
|
38
|
+
out = @logio.string.dup
|
39
|
+
@marks.reverse.each_with_index do |mark, index|
|
40
|
+
out.insert(mark, " INFO -- Log messages for run #{@marks.length - index} are following\n")
|
41
|
+
end if out.length > 0
|
42
|
+
out
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Only used when #sync is +false: Mark the location in the log stream where a new update/write
|
47
|
+
# run begins.
|
48
|
+
def mark_new_cycle
|
49
|
+
if !@sync
|
50
|
+
@marks << @logio.string.length
|
51
|
+
end
|
35
52
|
end
|
36
53
|
|
37
54
|
# The severity threshold level.
|
data/lib/webgen/node.rb
CHANGED
@@ -77,7 +77,7 @@ module Webgen
|
|
77
77
|
def reinit(path, meta_info = {})
|
78
78
|
old_path = @path
|
79
79
|
@path = path.freeze
|
80
|
-
@lang = meta_info.delete('lang')
|
80
|
+
@lang = Webgen::LanguageManager.language_for_code(meta_info.delete('lang'))
|
81
81
|
@lang = nil unless is_file?
|
82
82
|
@meta_info = meta_info
|
83
83
|
@flags = Set.new([:dirty, :created])
|
data/lib/webgen/page.rb
CHANGED
@@ -106,7 +106,7 @@ module Webgen
|
|
106
106
|
options, content = *block_data
|
107
107
|
md = RE_BLOCKS_OPTIONS.match(options.to_s)
|
108
108
|
raise(WebgenPageFormatError, "Found invalid blocks starting line for block #{index+1}: #{options}") if content =~ /\A---/ || md.nil?
|
109
|
-
options = Hash[*md[1].to_s.scan(/(\w+):([^\s]*)/).map {|k,v| [k, YAML::load(v)]}.flatten]
|
109
|
+
options = Hash[*md[1].to_s.scan(/(\w+):([^\s]*)/).map {|k,v| [k, (v == '' ? nil : YAML::load(v))]}.flatten]
|
110
110
|
options = (meta_info['blocks']['default'] || {} rescue {}).
|
111
111
|
merge((meta_info['blocks'][index+1] || {} rescue {})).
|
112
112
|
merge(options)
|
data/lib/webgen/sourcehandler.rb
CHANGED
@@ -41,8 +41,11 @@ module Webgen
|
|
41
41
|
# are checked (nodes for deleted sources are deleted, nodes for new and changed sources).
|
42
42
|
def render(tree)
|
43
43
|
begin
|
44
|
+
website.logger.mark_new_cycle if website.logger
|
45
|
+
|
44
46
|
puts "Updating tree..."
|
45
47
|
time = Benchmark.measure do
|
48
|
+
website.cache.reset_volatile_cache
|
46
49
|
update_tree(tree)
|
47
50
|
end
|
48
51
|
puts "...done in " + ('%2.4f' % time.real) + ' seconds'
|
@@ -46,8 +46,7 @@ module Webgen::SourceHandler
|
|
46
46
|
render(Webgen::ContentProcessor::Context.new(:chain => [node])).content
|
47
47
|
else
|
48
48
|
feed = (website.cache.volatile[:sourcehandler_feed] ||= {})[node.node_info[:src]] ||= build_feed_for(node)
|
49
|
-
feed.feed_type
|
50
|
-
feed.build_xml
|
49
|
+
feed.build_xml(node.node_info[:feed_type], (node.node_info[:feed_type] == 'rss' ? node['rss_version'] || 2.0 : nil))
|
51
50
|
end
|
52
51
|
end
|
53
52
|
|
@@ -58,8 +57,7 @@ module Webgen::SourceHandler
|
|
58
57
|
|
59
58
|
node.tree.node_access[:alcn].values.
|
60
59
|
select {|node| patterns.any? {|pat| node =~ pat} && node.node_info[:page]}.
|
61
|
-
sort {|a,b| a['modified_at'] <=> b['modified_at']}
|
62
|
-
reverse[0, nr_items]
|
60
|
+
sort {|a,b| a['modified_at'] <=> b['modified_at']}[0, nr_items]
|
63
61
|
end
|
64
62
|
|
65
63
|
#######
|
@@ -85,13 +83,12 @@ module Webgen::SourceHandler
|
|
85
83
|
feed.published = (node['created_at'].kind_of?(Time) ? node['created_at'] : Time.now)
|
86
84
|
feed.updated = Time.now
|
87
85
|
feed.generator = 'webgen - Webgen::SourceHandler::Feed'
|
88
|
-
feed.icon = File.join(site_url, node.tree[node['icon']].path) if node['icon']
|
89
86
|
|
90
87
|
node.feed_entries.each do |entry|
|
91
88
|
item = FeedTools::FeedItem.new
|
92
89
|
item.title = entry['title']
|
93
90
|
item.link = File.join(site_url, entry.path)
|
94
|
-
item.content = entry.node_info[:page].blocks['content'].render(Webgen::ContentProcessor::Context.new(:chain => [entry])).content
|
91
|
+
item.content = entry.node_info[:page].blocks[node['content_block_name'] || 'content'].render(Webgen::ContentProcessor::Context.new(:chain => [entry])).content
|
95
92
|
item.updated = entry['modified_at']
|
96
93
|
item.published = entry['created_at'] if entry['created_at'].kind_of?(Time)
|
97
94
|
if entry['author']
|
@@ -18,23 +18,7 @@ module Webgen::SourceHandler
|
|
18
18
|
|
19
19
|
super(parent, path) do |node|
|
20
20
|
node.node_info[:sh_page_node_mi] = Webgen::Page.meta_info_from_data(path.io.data)
|
21
|
-
|
22
21
|
node.node_info[:page] = page
|
23
|
-
tmp_logger = website.logger
|
24
|
-
website.logger = nil # disabling logging whiling creating fragment nodes
|
25
|
-
|
26
|
-
website.cache.permanent[:page_sections] ||= {}
|
27
|
-
sections = if path.changed? || !website.cache.permanent[:page_sections][node.absolute_lcn]
|
28
|
-
website.blackboard.invoke(:parse_html_headers, render_node(node, 'content', []))
|
29
|
-
else
|
30
|
-
website.cache.permanent[:page_sections][node.absolute_lcn]
|
31
|
-
end
|
32
|
-
website.cache.permanent[:page_sections][node.absolute_lcn] = sections
|
33
|
-
website.blackboard.invoke(:create_fragment_nodes,
|
34
|
-
sections,
|
35
|
-
node, website.blackboard.invoke(:source_paths)[path.source_path],
|
36
|
-
node.meta_info['fragments_in_menu'])
|
37
|
-
website.logger = tmp_logger
|
38
22
|
end
|
39
23
|
end
|
40
24
|
|
data/lib/webgen/tag/langbar.rb
CHANGED
@@ -17,7 +17,7 @@ module Webgen::Tag
|
|
17
17
|
result = lang_nodes.
|
18
18
|
reject {|n| (context.content_node.lang == n.lang && !param('tag.langbar.show_own_lang'))}.
|
19
19
|
sort {|a, b| a.lang <=> b.lang}.
|
20
|
-
collect {|n| context.dest_node.link_to(n, :link_text => n.lang, :lang => n.lang)}.
|
20
|
+
collect {|n| context.dest_node.link_to(n, :link_text => (param('tag.langbar.lang_names')[n.lang] || n.lang), :lang => n.lang)}.
|
21
21
|
join(param('tag.langbar.separator'))
|
22
22
|
(param('tag.langbar.show_single_lang') || lang_nodes.length > 1 ? result : "")
|
23
23
|
end
|
data/lib/webgen/tree.rb
CHANGED
@@ -56,8 +56,9 @@ module Webgen
|
|
56
56
|
|
57
57
|
# A utility method called by Node#reinit. This method should not be used directly!
|
58
58
|
def register_path(node)
|
59
|
+
return if node['no_output']
|
59
60
|
if @node_access[:path].has_key?(node.path)
|
60
|
-
raise "Can't have two nodes with same output path: #{node.path}"
|
61
|
+
raise "Can't have two nodes with same output path: #{node.path}"
|
61
62
|
else
|
62
63
|
@node_access[:path][node.path] = node
|
63
64
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'test/helper'
|
3
|
+
require 'webgen/page'
|
4
|
+
require 'webgen/tree'
|
5
|
+
require 'webgen/contentprocessor'
|
6
|
+
|
7
|
+
class TestContentProcessorFragments < Test::Unit::TestCase
|
8
|
+
|
9
|
+
include Test::WebsiteHelper
|
10
|
+
|
11
|
+
def test_process
|
12
|
+
Webgen::SourceHandler::Main.new
|
13
|
+
@website.blackboard.del_service(:source_paths)
|
14
|
+
@website.blackboard.add_service(:source_paths) { Hash.new(path_with_meta_info('/')) }
|
15
|
+
|
16
|
+
obj = Webgen::ContentProcessor::Fragments.new
|
17
|
+
root = Webgen::Node.new(Webgen::Tree.new.dummy_root, '/', '/')
|
18
|
+
root.node_info[:src] = '/'
|
19
|
+
processors = { 'fragments' => obj }
|
20
|
+
|
21
|
+
context = Webgen::ContentProcessor::Context.new(:chain => [root], :processors => processors)
|
22
|
+
context.content = '<h1 id="test">Test</h1><h1>Test2</h1>'
|
23
|
+
obj.call(context)
|
24
|
+
assert(root.tree['/#test'])
|
25
|
+
assert_equal(3, root.tree.node_access[:alcn].length)
|
26
|
+
root.tree.delete_node('/#test')
|
27
|
+
|
28
|
+
context[:block] = Webgen::Block.new('content', '', {})
|
29
|
+
obj.call(context)
|
30
|
+
assert(root.tree['/#test'])
|
31
|
+
assert_equal(3, root.tree.node_access[:alcn].length)
|
32
|
+
root.tree.delete_node('/#test')
|
33
|
+
|
34
|
+
context[:block] = Webgen::Block.new('other', '', {})
|
35
|
+
obj.call(context)
|
36
|
+
assert(!root.tree['/#test'])
|
37
|
+
assert_equal(2, root.tree.node_access[:alcn].length)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
data/test/test_languages.rb
CHANGED
@@ -50,4 +50,16 @@ class TestLanguages < Test::Unit::TestCase
|
|
50
50
|
assert_equal(-1, ace <=> eng)
|
51
51
|
end
|
52
52
|
|
53
|
+
def test_hashing
|
54
|
+
de = Webgen::LanguageManager.language_for_code('ger')
|
55
|
+
en = Webgen::LanguageManager.language_for_code('en')
|
56
|
+
h = {'de' => de, en => en}
|
57
|
+
assert_equal(de, h[de])
|
58
|
+
assert_equal(de, h['de'])
|
59
|
+
assert_equal(en, h[en])
|
60
|
+
assert_not_equal(en, h['en']) # bc 'en'.eql?(en) is false
|
61
|
+
assert_equal(Webgen::LanguageManager.language_for_code('en'),
|
62
|
+
Webgen::LanguageManager.language_for_code(en))
|
63
|
+
end
|
64
|
+
|
53
65
|
end
|
data/test/test_logger.rb
CHANGED
@@ -70,4 +70,23 @@ class TestLogger < Test::Unit::TestCase
|
|
70
70
|
assert_equal("ERROR -- hallo\n", l.log_output)
|
71
71
|
end
|
72
72
|
|
73
|
+
def test_run_marks
|
74
|
+
l = Webgen::Logger.new(io = StringIO.new, true)
|
75
|
+
l.mark_new_cycle
|
76
|
+
l.error { 'hallo' }
|
77
|
+
assert_equal("", l.log_output)
|
78
|
+
|
79
|
+
l = Webgen::Logger.new(io = StringIO.new, false)
|
80
|
+
l.error { 'hallo' }
|
81
|
+
l.mark_new_cycle
|
82
|
+
l.error { 'other' }
|
83
|
+
l.mark_new_cycle
|
84
|
+
assert_equal("ERROR -- hallo\n INFO -- Log messages for run 1 are following\n" +
|
85
|
+
"ERROR -- other\n INFO -- Log messages for run 2 are following\n", l.log_output)
|
86
|
+
|
87
|
+
l = Webgen::Logger.new(io = StringIO.new, false)
|
88
|
+
l.mark_new_cycle
|
89
|
+
assert_equal("", l.log_output)
|
90
|
+
end
|
91
|
+
|
73
92
|
end
|
data/test/test_node.rb
CHANGED
@@ -39,6 +39,7 @@ class TestNode < Test::Unit::TestCase
|
|
39
39
|
assert_equal(lcn, node.lcn)
|
40
40
|
assert_equal(alcn, node.absolute_lcn)
|
41
41
|
assert_equal(lang, node.lang)
|
42
|
+
assert_kind_of(Webgen::Language, node.lang) if node.lang
|
42
43
|
assert(node.flagged(:dirty))
|
43
44
|
assert(node.flagged(:created))
|
44
45
|
assert_equal(mi, node.meta_info)
|
data/test/test_page.rb
CHANGED
@@ -97,14 +97,14 @@ class TestPage < Test::Unit::TestCase
|
|
97
97
|
--- name:block
|
98
98
|
content doing -
|
99
99
|
with?: with some things
|
100
|
-
--- other:options test1:true test2:false test3:542
|
100
|
+
--- other:options test1:true test2:false test3:542 pipeline:
|
101
101
|
meta_info: {}
|
102
102
|
blocks:
|
103
103
|
- name: block
|
104
104
|
content: "content doing -\\nwith?: with some things"
|
105
105
|
- name: block2
|
106
106
|
content: ''
|
107
|
-
options: {other: options, test1: true, test2: false, test3: 542}
|
107
|
+
options: {other: options, test1: true, test2: false, test3: 542, pipeline: ~}
|
108
108
|
|
109
109
|
# block with seemingly block start line it
|
110
110
|
- in: |
|
@@ -12,6 +12,7 @@ class TestSourceHandlerFeed < Test::Unit::TestCase
|
|
12
12
|
site_url: http://example.com
|
13
13
|
entries: *.html
|
14
14
|
author: Thomas Leitner
|
15
|
+
content_block_name: abstract
|
15
16
|
--- name:rss_template
|
16
17
|
hallo
|
17
18
|
EOF
|
@@ -22,7 +23,7 @@ EOF
|
|
22
23
|
:file1_en => Webgen::Node.new(root, '/file1.en.html', 'file1.html', {'lang' => 'en', 'in_menu' => true, 'modified_at' => Time.now}),
|
23
24
|
:index_en => Webgen::Node.new(root, '/index.en.html', 'index.html', {'lang' => 'en', 'modified_at' => Time.now - 1, 'author' => 'test'}),
|
24
25
|
}
|
25
|
-
@nodes[:index_en].node_info[:page] = Webgen::Page.from_data("
|
26
|
+
@nodes[:index_en].node_info[:page] = Webgen::Page.from_data("--- name:content\nMyContent\n--- name:abstract\nRealContent")
|
26
27
|
@obj = Webgen::SourceHandler::Feed.new
|
27
28
|
@path = path_with_meta_info('/test.feed', {}, @obj.class.name) {StringIO.new(FEED_CONTENT)}
|
28
29
|
end
|
@@ -43,6 +44,7 @@ EOF
|
|
43
44
|
atom_node, rss_node = @obj.create_node(@nodes[:root], @path)
|
44
45
|
assert_equal('hallo', rss_node.content)
|
45
46
|
assert(atom_node.content =~ /Thomas Leitner/)
|
47
|
+
assert(atom_node.content =~ /RealContent/)
|
46
48
|
end
|
47
49
|
|
48
50
|
def test_feed_entries
|
@@ -10,11 +10,7 @@ class TestSourceHandlerPage < Test::Unit::TestCase
|
|
10
10
|
def setup
|
11
11
|
super
|
12
12
|
@website.blackboard.del_service(:templates_for_node)
|
13
|
-
@website.blackboard.del_service(:parse_html_sections)
|
14
|
-
@website.blackboard.del_service(:create_fragment_nodes)
|
15
13
|
@website.blackboard.add_service(:templates_for_node) {|node| []}
|
16
|
-
@website.blackboard.add_service(:parse_html_sections) {[]}
|
17
|
-
@website.blackboard.add_service(:create_fragment_nodes) {nil}
|
18
14
|
@obj = Webgen::SourceHandler::Page.new
|
19
15
|
@root = Webgen::Node.new(Webgen::Tree.new.dummy_root, 'test/', 'test')
|
20
16
|
@path = path_with_meta_info('/index.page') {StringIO.new('content')}
|
@@ -32,7 +28,6 @@ class TestSourceHandlerPage < Test::Unit::TestCase
|
|
32
28
|
assert_equal('yes', node['test'])
|
33
29
|
assert_equal(6, node['sort_info'])
|
34
30
|
assert_equal(Webgen::LanguageManager.language_for_code('epo'), node.lang)
|
35
|
-
assert_not_nil(@website.cache.permanent[:page_sections]['/test/index.eo.html'])
|
36
31
|
|
37
32
|
assert_equal(node, @obj.create_node(@root, @path.dup))
|
38
33
|
|
data/test/test_tag_langbar.rb
CHANGED
@@ -31,7 +31,13 @@ class TestTagLangbar < Test::Unit::TestCase
|
|
31
31
|
check_results(nodes[:file_en], link, '', '', '')
|
32
32
|
|
33
33
|
@obj.set_params('tag.langbar.show_single_lang' => true, 'tag.langbar.show_own_lang' => true, 'tag.langbar.separator' => ' --- ')
|
34
|
-
assert_equal("#{de_link} --- #{en_link}",
|
34
|
+
assert_equal("#{de_link} --- #{en_link}",
|
35
|
+
@obj.call('langbar', '', Webgen::ContentProcessor::Context.new(:chain => [nodes[:index_en]])))
|
36
|
+
|
37
|
+
@obj.set_params('tag.langbar.show_single_lang' => true, 'tag.langbar.show_own_lang' => true,
|
38
|
+
'tag.langbar.lang_names' => {'de' => 'Deutsch'})
|
39
|
+
assert_equal("<a href=\"index.de.html\">Deutsch</a> | #{en_link}",
|
40
|
+
@obj.call('langbar', '', Webgen::ContentProcessor::Context.new(:chain => [nodes[:index_en]])))
|
35
41
|
|
36
42
|
nodes[:index_en].unflag(:dirty)
|
37
43
|
@website.blackboard.dispatch_msg(:node_changed?, nodes[:index_en])
|
data/test/test_tree.rb
CHANGED
@@ -20,8 +20,8 @@ class TestTree < Test::Unit::TestCase
|
|
20
20
|
assert_equal(root, @tree.root)
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
24
|
-
# Tree#register_node is called when creating a node
|
23
|
+
def test_register_node_and_register_path
|
24
|
+
# Tree#register_node/_path is called when creating a node
|
25
25
|
node = Webgen::Node.new(@tree.dummy_root, 'dummy/', 'dummy')
|
26
26
|
assert_equal(node, @tree['/dummy', :alcn])
|
27
27
|
assert_equal(node, @tree['/dummy', :acn])
|
@@ -29,6 +29,8 @@ class TestTree < Test::Unit::TestCase
|
|
29
29
|
assert_raise(RuntimeError) { Webgen::Node.new(@tree.dummy_root, '/', 'dummy') }
|
30
30
|
assert_raise(RuntimeError) { Webgen::Node.new(@tree.dummy_root, 'dummy/', 'other') }
|
31
31
|
assert_nothing_raised { Webgen::Node.new(@tree.dummy_root, 'dummy/', 'unknown', {'no_output' => true}) }
|
32
|
+
Webgen::Node.new(@tree.dummy_root, 'new', 'new', {'no_output' => true})
|
33
|
+
assert(!@tree['new', :path])
|
32
34
|
end
|
33
35
|
|
34
36
|
def test_delete_node
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gettalong-webgen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.5.
|
4
|
+
version: 0.5.5.20081012
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Leitner
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-10-
|
12
|
+
date: 2008-10-11 15:00:00 -07:00
|
13
13
|
default_executable: webgen
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -360,6 +360,7 @@ files:
|
|
360
360
|
- doc/contentprocessor/builder.page
|
361
361
|
- doc/contentprocessor/erb.page
|
362
362
|
- doc/contentprocessor/erubis.page
|
363
|
+
- doc/contentprocessor/fragments.page
|
363
364
|
- doc/contentprocessor/haml.page
|
364
365
|
- doc/contentprocessor/maruku.page
|
365
366
|
- doc/contentprocessor/rdiscount.page
|
@@ -417,6 +418,7 @@ files:
|
|
417
418
|
- lib/webgen/contentprocessor/context.rb
|
418
419
|
- lib/webgen/contentprocessor/erb.rb
|
419
420
|
- lib/webgen/contentprocessor/erubis.rb
|
421
|
+
- lib/webgen/contentprocessor/fragments.rb
|
420
422
|
- lib/webgen/contentprocessor/haml.rb
|
421
423
|
- lib/webgen/contentprocessor/maruku.rb
|
422
424
|
- lib/webgen/contentprocessor/rdiscount.rb
|
@@ -492,6 +494,7 @@ files:
|
|
492
494
|
- test/test_contentprocessor_context.rb
|
493
495
|
- test/test_contentprocessor_erb.rb
|
494
496
|
- test/test_contentprocessor_erubis.rb
|
497
|
+
- test/test_contentprocessor_fragments.rb
|
495
498
|
- test/test_contentprocessor_haml.rb
|
496
499
|
- test/test_contentprocessor_maruku.rb
|
497
500
|
- test/test_contentprocessor_rdiscount.rb
|