walrus 0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/walrus +44 -0
- data/ext/jindex/extconf.rb +11 -0
- data/ext/jindex/jindex.c +79 -0
- data/ext/mkdtemp/extconf.rb +11 -0
- data/ext/mkdtemp/mkdtemp.c +41 -0
- data/lib/walrus/additions/module.rb +36 -0
- data/lib/walrus/additions/string.rb +37 -0
- data/lib/walrus/additions/test/unit/error_collector.rb +62 -0
- data/lib/walrus/compile_error.rb +28 -0
- data/lib/walrus/compiler.rb +124 -0
- data/lib/walrus/contrib/spec/walruscloth_spec.rb +32 -0
- data/lib/walrus/contrib/walruscloth.rb +82 -0
- data/lib/walrus/diff.rb +89 -0
- data/lib/walrus/document.rb +98 -0
- data/lib/walrus/grammar/additions/proc.rb +20 -0
- data/lib/walrus/grammar/additions/regexp.rb +21 -0
- data/lib/walrus/grammar/additions/string.rb +52 -0
- data/lib/walrus/grammar/additions/symbol.rb +42 -0
- data/lib/walrus/grammar/and_predicate.rb +40 -0
- data/lib/walrus/grammar/array_result.rb +19 -0
- data/lib/walrus/grammar/continuation_wrapper_exception.rb +28 -0
- data/lib/walrus/grammar/left_recursion_exception.rb +27 -0
- data/lib/walrus/grammar/location_tracking.rb +105 -0
- data/lib/walrus/grammar/match_data_wrapper.rb +65 -0
- data/lib/walrus/grammar/memoizing.rb +41 -0
- data/lib/walrus/grammar/memoizing_cache.rb +94 -0
- data/lib/walrus/grammar/node.rb +60 -0
- data/lib/walrus/grammar/not_predicate.rb +40 -0
- data/lib/walrus/grammar/parse_error.rb +39 -0
- data/lib/walrus/grammar/parser_state.rb +181 -0
- data/lib/walrus/grammar/parslet.rb +28 -0
- data/lib/walrus/grammar/parslet_choice.rb +120 -0
- data/lib/walrus/grammar/parslet_combination.rb +26 -0
- data/lib/walrus/grammar/parslet_combining.rb +154 -0
- data/lib/walrus/grammar/parslet_merge.rb +88 -0
- data/lib/walrus/grammar/parslet_omission.rb +57 -0
- data/lib/walrus/grammar/parslet_repetition.rb +97 -0
- data/lib/walrus/grammar/parslet_repetition_default.rb +58 -0
- data/lib/walrus/grammar/parslet_sequence.rb +202 -0
- data/lib/walrus/grammar/predicate.rb +57 -0
- data/lib/walrus/grammar/proc_parslet.rb +52 -0
- data/lib/walrus/grammar/regexp_parslet.rb +73 -0
- data/lib/walrus/grammar/skipped_substring_exception.rb +36 -0
- data/lib/walrus/grammar/string_enumerator.rb +45 -0
- data/lib/walrus/grammar/string_parslet.rb +75 -0
- data/lib/walrus/grammar/string_result.rb +24 -0
- data/lib/walrus/grammar/symbol_parslet.rb +63 -0
- data/lib/walrus/grammar.rb +170 -0
- data/lib/walrus/no_parameter_marker.rb +19 -0
- data/lib/walrus/parser.rb +420 -0
- data/lib/walrus/runner.rb +356 -0
- data/lib/walrus/template.rb +75 -0
- data/lib/walrus/walrus_grammar/assignment_expression.rb +24 -0
- data/lib/walrus/walrus_grammar/block_directive.rb +28 -0
- data/lib/walrus/walrus_grammar/comment.rb +24 -0
- data/lib/walrus/walrus_grammar/def_directive.rb +64 -0
- data/lib/walrus/walrus_grammar/echo_directive.rb +44 -0
- data/lib/walrus/walrus_grammar/escape_sequence.rb +24 -0
- data/lib/walrus/walrus_grammar/import_directive.rb +44 -0
- data/lib/walrus/walrus_grammar/include_directive.rb +27 -0
- data/lib/walrus/walrus_grammar/instance_variable.rb +24 -0
- data/lib/walrus/walrus_grammar/literal.rb +24 -0
- data/lib/walrus/walrus_grammar/message_expression.rb +25 -0
- data/lib/walrus/walrus_grammar/multiline_comment.rb +54 -0
- data/lib/walrus/walrus_grammar/placeholder.rb +40 -0
- data/lib/walrus/walrus_grammar/raw_directive.rb +42 -0
- data/lib/walrus/walrus_grammar/raw_text.rb +45 -0
- data/lib/walrus/walrus_grammar/ruby_directive.rb +29 -0
- data/lib/walrus/walrus_grammar/ruby_expression.rb +31 -0
- data/lib/walrus/walrus_grammar/set_directive.rb +24 -0
- data/lib/walrus/walrus_grammar/silent_directive.rb +44 -0
- data/lib/walrus/walrus_grammar/slurp_directive.rb +25 -0
- data/lib/walrus/walrus_grammar/super_directive.rb +27 -0
- data/lib/walrus.rb +64 -0
- data/spec/acceptance/acceptance_spec.rb +97 -0
- data/spec/acceptance/block/basic_block.expected +1 -0
- data/spec/acceptance/block/basic_block.tmpl +3 -0
- data/spec/acceptance/block/nested_blocks.expected +5 -0
- data/spec/acceptance/block/nested_blocks.tmpl +11 -0
- data/spec/acceptance/comments/comments_and_text.expected +3 -0
- data/spec/acceptance/comments/comments_and_text.tmpl +6 -0
- data/spec/acceptance/comments/single_comment.expected +0 -0
- data/spec/acceptance/comments/single_comment.tmpl +1 -0
- data/spec/acceptance/def/alternative_def_calling_conventions.expected +3 -0
- data/spec/acceptance/def/alternative_def_calling_conventions.tmpl +18 -0
- data/spec/acceptance/def/basic_def_block_no_output.expected +0 -0
- data/spec/acceptance/def/basic_def_block_no_output.tmpl +17 -0
- data/spec/acceptance/def/defs_can_be_called_multiple_times.expected +3 -0
- data/spec/acceptance/def/defs_can_be_called_multiple_times.tmpl +6 -0
- data/spec/acceptance/def/defs_can_be_dynamic.expected +4 -0
- data/spec/acceptance/def/defs_can_be_dynamic.tmpl +12 -0
- data/spec/acceptance/echo/echo_directive_with_numeric_literal.expected +1 -0
- data/spec/acceptance/echo/echo_directive_with_numeric_literal.tmpl +1 -0
- data/spec/acceptance/echo/echo_expression_list.expected +1 -0
- data/spec/acceptance/echo/echo_expression_list.tmpl +1 -0
- data/spec/acceptance/echo/echo_short_notation.expected +1 -0
- data/spec/acceptance/echo/echo_short_notation.tmpl +1 -0
- data/spec/acceptance/echo/echo_simple_expression.expected +1 -0
- data/spec/acceptance/echo/echo_simple_expression.tmpl +1 -0
- data/spec/acceptance/echo/echo_single_quoted_string_literal.expected +1 -0
- data/spec/acceptance/echo/echo_single_quoted_string_literal.tmpl +1 -0
- data/spec/acceptance/echo/multiple_echo_statements.expected +1 -0
- data/spec/acceptance/echo/multiple_echo_statements.tmpl +2 -0
- data/spec/acceptance/includes/basic_included_file.txt +1 -0
- data/spec/acceptance/includes/basic_includer.complex +3 -0
- data/spec/acceptance/includes/basic_includer.expected +3 -0
- data/spec/acceptance/includes/basic_includer.rb +38 -0
- data/spec/acceptance/includes/complicated_included_file.txt +3 -0
- data/spec/acceptance/includes/complicated_includer.complex +3 -0
- data/spec/acceptance/includes/complicated_includer.expected +3 -0
- data/spec/acceptance/includes/complicated_includer.rb +41 -0
- data/spec/acceptance/includes/nested_include_1.txt +3 -0
- data/spec/acceptance/includes/nested_include_2.txt +1 -0
- data/spec/acceptance/includes/nested_includer.complex +3 -0
- data/spec/acceptance/includes/nested_includer.expected +4 -0
- data/spec/acceptance/includes/nested_includer.rb +41 -0
- data/spec/acceptance/inheritance/basic_child.complex +10 -0
- data/spec/acceptance/inheritance/basic_child.expected +9 -0
- data/spec/acceptance/inheritance/basic_child.rb +54 -0
- data/spec/acceptance/inheritance/basic_parent.complex +5 -0
- data/spec/acceptance/inheritance/basic_parent.expected +3 -0
- data/spec/acceptance/inheritance/basic_parent.rb +41 -0
- data/spec/acceptance/inheritance/importing_child.complex +8 -0
- data/spec/acceptance/inheritance/importing_child.expected +7 -0
- data/spec/acceptance/inheritance/importing_child.rb +46 -0
- data/spec/acceptance/inheritance/subdirectory/importing_child_in_subdirectory.complex +8 -0
- data/spec/acceptance/inheritance/subdirectory/importing_child_in_subdirectory.expected +7 -0
- data/spec/acceptance/inheritance/subdirectory/importing_child_in_subdirectory.rb +44 -0
- data/spec/acceptance/multiline_comments/multiline_comment_with_directives_inside.expected +0 -0
- data/spec/acceptance/multiline_comments/multiline_comment_with_directives_inside.tmpl +15 -0
- data/spec/acceptance/multiline_comments/simple_multiline_comment.expected +2 -0
- data/spec/acceptance/multiline_comments/simple_multiline_comment.tmpl +4 -0
- data/spec/acceptance/raw/complicated_raw_example.expected +57 -0
- data/spec/acceptance/raw/complicated_raw_example.tmpl +79 -0
- data/spec/acceptance/raw-text/UTF_8.expected +12 -0
- data/spec/acceptance/raw-text/UTF_8.tmpl +12 -0
- data/spec/acceptance/raw-text/empty_file.expected +0 -0
- data/spec/acceptance/raw-text/empty_file.tmpl +0 -0
- data/spec/acceptance/raw-text/multi_line.expected +4 -0
- data/spec/acceptance/raw-text/multi_line.tmpl +4 -0
- data/spec/acceptance/raw-text/single_line.expected +1 -0
- data/spec/acceptance/raw-text/single_line.tmpl +1 -0
- data/spec/acceptance/raw-text/single_line_whitespace.expected +1 -0
- data/spec/acceptance/raw-text/single_line_whitespace.tmpl +1 -0
- data/spec/acceptance/ruby/ruby_directive_is_just_like_silent.expected +1 -0
- data/spec/acceptance/ruby/ruby_directive_is_just_like_silent.tmpl +4 -0
- data/spec/acceptance/ruby/ruby_directive_using_here_doc.expected +1 -0
- data/spec/acceptance/ruby/ruby_directive_using_here_doc.tmpl +4 -0
- data/spec/acceptance/ruby/ruby_directive_using_here_doc_alt_syntax.expected +1 -0
- data/spec/acceptance/ruby/ruby_directive_using_here_doc_alt_syntax.tmpl +4 -0
- data/spec/acceptance/ruby/ruby_directive_with_accumulate.expected +1 -0
- data/spec/acceptance/ruby/ruby_directive_with_accumulate.tmpl +4 -0
- data/spec/acceptance/ruby/ruby_directive_with_accumulate_and_block.expected +1 -0
- data/spec/acceptance/ruby/ruby_directive_with_accumulate_and_block.tmpl +6 -0
- data/spec/acceptance/set/unused_set.expected +0 -0
- data/spec/acceptance/set/unused_set.tmpl +1 -0
- data/spec/acceptance/set/used_set.expected +1 -0
- data/spec/acceptance/set/used_set.tmpl +2 -0
- data/spec/acceptance/silent/silent_and_echo_combined.expected +1 -0
- data/spec/acceptance/silent/silent_and_echo_combined.tmpl +2 -0
- data/spec/acceptance/silent/silent_short_notation.expected +1 -0
- data/spec/acceptance/silent/silent_short_notation.tmpl +1 -0
- data/spec/acceptance/silent/simple_silent_directive.expected +0 -0
- data/spec/acceptance/silent/simple_silent_directive.tmpl +1 -0
- data/spec/acceptance/slurp/basic_slurp_demo.expected +1 -0
- data/spec/acceptance/slurp/basic_slurp_demo.tmpl +4 -0
- data/spec/acceptance/super/super_with_no_effect.expected +4 -0
- data/spec/acceptance/super/super_with_no_effect.tmpl +5 -0
- data/spec/additions/module_spec.rb +126 -0
- data/spec/additions/string_spec.rb +99 -0
- data/spec/compiler_spec.rb +55 -0
- data/spec/grammar/additions/proc_spec.rb +25 -0
- data/spec/grammar/additions/regexp_spec.rb +37 -0
- data/spec/grammar/additions/string_spec.rb +106 -0
- data/spec/grammar/and_predicate_spec.rb +29 -0
- data/spec/grammar/continuation_wrapper_exception_spec.rb +23 -0
- data/spec/grammar/match_data_wrapper_spec.rb +41 -0
- data/spec/grammar/memoizing_cache_spec.rb +112 -0
- data/spec/grammar/node_spec.rb +126 -0
- data/spec/grammar/not_predicate_spec.rb +29 -0
- data/spec/grammar/parser_state_spec.rb +172 -0
- data/spec/grammar/parslet_choice_spec.rb +49 -0
- data/spec/grammar/parslet_combining_spec.rb +287 -0
- data/spec/grammar/parslet_merge_spec.rb +33 -0
- data/spec/grammar/parslet_omission_spec.rb +58 -0
- data/spec/grammar/parslet_repetition_spec.rb +77 -0
- data/spec/grammar/parslet_sequence_spec.rb +49 -0
- data/spec/grammar/parslet_spec.rb +23 -0
- data/spec/grammar/predicate_spec.rb +53 -0
- data/spec/grammar/proc_parslet_spec.rb +52 -0
- data/spec/grammar/regexp_parslet_spec.rb +347 -0
- data/spec/grammar/string_enumerator_spec.rb +94 -0
- data/spec/grammar/string_parslet_spec.rb +143 -0
- data/spec/grammar/symbol_parslet_spec.rb +30 -0
- data/spec/grammar_spec.rb +545 -0
- data/spec/parser_spec.rb +1418 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/walrus_grammar/comment_spec.rb +39 -0
- data/spec/walrus_grammar/echo_directive_spec.rb +63 -0
- data/spec/walrus_grammar/escape_sequence_spec.rb +85 -0
- data/spec/walrus_grammar/literal_spec.rb +41 -0
- data/spec/walrus_grammar/message_expression_spec.rb +37 -0
- data/spec/walrus_grammar/multiline_comment_spec.rb +58 -0
- data/spec/walrus_grammar/placeholder_spec.rb +48 -0
- data/spec/walrus_grammar/raw_directive_spec.rb +81 -0
- data/spec/walrus_grammar/raw_text_spec.rb +65 -0
- data/spec/walrus_grammar/silent_directive_spec.rb +34 -0
- metadata +291 -0
@@ -0,0 +1,6 @@
|
|
1
|
+
This file contains comments ## like this one!
|
2
|
+
which should not appear in the template output...
|
3
|
+
## This line should be completely missing from the output
|
4
|
+
## and this one two, because the comments are the first
|
5
|
+
## (and only) thing on the lines
|
6
|
+
In the final output, this should be the third line...
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
## This template contains only a comment; the output file should be empty.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
## This example shows some alternative ways of causing #def content to appear in the output
|
2
|
+
## (by default #def content is not automatically injected into the output)
|
3
|
+
#def block1
|
4
|
+
This is block 1. It will be injected using the \#silent directive.
|
5
|
+
#end
|
6
|
+
#def block2
|
7
|
+
This is block 2. It will be injected using the \#ruby directive.
|
8
|
+
#end
|
9
|
+
#def block3
|
10
|
+
This is block 3. It will be referenced using a placeholder.
|
11
|
+
#end
|
12
|
+
## no need to call "accumulate" here because the block already does that.
|
13
|
+
#silent block1
|
14
|
+
#ruby
|
15
|
+
# no need to call "accumulate" here because the block already does that.
|
16
|
+
block2
|
17
|
+
#end
|
18
|
+
$block3
|
File without changes
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#def body
|
2
|
+
The key distinction between the \#block and \#def directives is that
|
3
|
+
the former automatically produces output in the template whereas the
|
4
|
+
latter only produces output if explicitly caused to do so (via a
|
5
|
+
placeholder).
|
6
|
+
|
7
|
+
Basically, a \#def directive defines a chunk of material that can be
|
8
|
+
used in a template or overridden or customized in an inheriting
|
9
|
+
template. The chunk is defined but no output is included by default.
|
10
|
+
|
11
|
+
A \#block directive, on the other hand, both defines a chunk and
|
12
|
+
automatically emits its contents in the template at the point it was
|
13
|
+
defined.
|
14
|
+
|
15
|
+
As such, this sample file will produce no output, although it will
|
16
|
+
cause a method to be added to the compiled version of the template.
|
17
|
+
#end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
#def counter
|
2
|
+
#ruby
|
3
|
+
@counter ||= 0 # initialize counter
|
4
|
+
@counter += 1 # increment counter
|
5
|
+
#end
|
6
|
+
#end
|
7
|
+
## Note how in the first three cases below I use an explicit end-of-directive marker;
|
8
|
+
## this is to ensure that Walrus "sees" (and emits) a newline after each number.
|
9
|
+
#echo counter#
|
10
|
+
#echo counter#
|
11
|
+
#echo counter#
|
12
|
+
#echo counter
|
@@ -0,0 +1 @@
|
|
1
|
+
42
|
@@ -0,0 +1 @@
|
|
1
|
+
#echo 42
|
@@ -0,0 +1 @@
|
|
1
|
+
It doesn't get much simpler than this...
|
@@ -0,0 +1 @@
|
|
1
|
+
#echo "It doesn't get much simpler than this"; "..."
|
@@ -0,0 +1 @@
|
|
1
|
+
42
|
@@ -0,0 +1 @@
|
|
1
|
+
#= 42 #
|
@@ -0,0 +1 @@
|
|
1
|
+
It doesn't get much simpler than this
|
@@ -0,0 +1 @@
|
|
1
|
+
#echo "It doesn't get much simpler than this"
|
@@ -0,0 +1 @@
|
|
1
|
+
Hello, world!
|
@@ -0,0 +1 @@
|
|
1
|
+
#echo 'Hello, world!'
|
@@ -0,0 +1 @@
|
|
1
|
+
foobar
|
@@ -0,0 +1 @@
|
|
1
|
+
Paragraph 2
|
@@ -0,0 +1,38 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated Fri Apr 13 16:10:49 +0200 2007 by Walrus version 0.1
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubygems'
|
6
|
+
rescue LoadError
|
7
|
+
# installing Walrus via RubyGems is recommended
|
8
|
+
# otherwise Walrus must be installed in the RUBYLIB load path
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'walrus/document'
|
12
|
+
|
13
|
+
module Walrus
|
14
|
+
|
15
|
+
class WalrusGrammar
|
16
|
+
|
17
|
+
class BasicIncluder < Document
|
18
|
+
|
19
|
+
def template_body
|
20
|
+
|
21
|
+
accumulate('Paragraph 1' + "\n") # RawText
|
22
|
+
# Include (start): basic_included_file.txt:
|
23
|
+
accumulate('Paragraph 2' + "\n") # RawText
|
24
|
+
accumulate('Paragraph 3') # RawText
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
if __FILE__ == $0 # when run from the command line the default action is to call 'run'
|
30
|
+
new.run
|
31
|
+
end
|
32
|
+
|
33
|
+
end # BasicIncluder
|
34
|
+
|
35
|
+
end # WalrusGrammar
|
36
|
+
|
37
|
+
end # Walrus
|
38
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated Fri Apr 13 16:10:50 +0200 2007 by Walrus version 0.1
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubygems'
|
6
|
+
rescue LoadError
|
7
|
+
# installing Walrus via RubyGems is recommended
|
8
|
+
# otherwise Walrus must be installed in the RUBYLIB load path
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'walrus/document'
|
12
|
+
|
13
|
+
module Walrus
|
14
|
+
|
15
|
+
class WalrusGrammar
|
16
|
+
|
17
|
+
class ComplicatedIncluder < Document
|
18
|
+
|
19
|
+
def template_body
|
20
|
+
|
21
|
+
accumulate('This example features an include file which itself contains a variety of directives.' + "\n") # RawText
|
22
|
+
# Include (start): complicated_included_file.txt:
|
23
|
+
accumulate('This is the included file.' + "\n") # RawText
|
24
|
+
# Comment: It features comments which won't appear in the final output.
|
25
|
+
instance_eval { @my_ivar='hello, world!' } # Silent directive
|
26
|
+
accumulate('Final paragraph, referencing an instance variable defined in the included file: ') # RawText
|
27
|
+
accumulate(instance_eval { @my_ivar }) # Echo directive
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
if __FILE__ == $0 # when run from the command line the default action is to call 'run'
|
33
|
+
new.run
|
34
|
+
end
|
35
|
+
|
36
|
+
end # ComplicatedIncluder
|
37
|
+
|
38
|
+
end # WalrusGrammar
|
39
|
+
|
40
|
+
end # Walrus
|
41
|
+
|
@@ -0,0 +1 @@
|
|
1
|
+
Paragraph 3
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated Fri Apr 13 16:10:50 +0200 2007 by Walrus version 0.1
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubygems'
|
6
|
+
rescue LoadError
|
7
|
+
# installing Walrus via RubyGems is recommended
|
8
|
+
# otherwise Walrus must be installed in the RUBYLIB load path
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'walrus/document'
|
12
|
+
|
13
|
+
module Walrus
|
14
|
+
|
15
|
+
class WalrusGrammar
|
16
|
+
|
17
|
+
class NestedIncluder < Document
|
18
|
+
|
19
|
+
def template_body
|
20
|
+
|
21
|
+
accumulate('Paragraph 1' + "\n") # RawText
|
22
|
+
# Include (start): nested_include_1.txt:
|
23
|
+
accumulate('Paragraph 2' + "\n") # RawText
|
24
|
+
# Comment: This next include will add "Paragraph 3":
|
25
|
+
# Include (start): nested_include_2.txt:
|
26
|
+
accumulate('Paragraph 3' + "\n") # RawText
|
27
|
+
accumulate('Paragraph 4') # RawText
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
if __FILE__ == $0 # when run from the command line the default action is to call 'run'
|
33
|
+
new.run
|
34
|
+
end
|
35
|
+
|
36
|
+
end # NestedIncluder
|
37
|
+
|
38
|
+
end # WalrusGrammar
|
39
|
+
|
40
|
+
end # Walrus
|
41
|
+
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#extends 'basic_parent'
|
2
|
+
#def footer
|
3
|
+
This is the overridden footer. Note that in the overridden version of the footer
|
4
|
+
I'm using a \#def block rather than a \#block like in the parent template. The
|
5
|
+
reason for this is that \#block calls automatically in-line their contents at
|
6
|
+
the point where they are declared.
|
7
|
+
|
8
|
+
Given that this template \#extends the parent, the parent will *already* be
|
9
|
+
in-lining the footer, so there is no need to in-line it again.
|
10
|
+
#end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
This is the base template which subclasses will inherit.
|
2
|
+
|
3
|
+
This is the overridden footer. Note that in the overridden version of the footer
|
4
|
+
I'm using a #def block rather than a #block like in the parent template. The
|
5
|
+
reason for this is that #block calls automatically in-line their contents at
|
6
|
+
the point where they are declared.
|
7
|
+
|
8
|
+
Given that this template #extends the parent, the parent will *already* be
|
9
|
+
in-lining the footer, so there is no need to in-line it again.
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated Fri Apr 13 16:10:51 +0200 2007 by Walrus version 0.1
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubygems'
|
6
|
+
rescue LoadError
|
7
|
+
# installing Walrus via RubyGems is recommended
|
8
|
+
# otherwise Walrus must be installed in the RUBYLIB load path
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'walrus/document'
|
12
|
+
require File.join(File.dirname(__FILE__), 'basic_parent').to_s
|
13
|
+
|
14
|
+
module Walrus
|
15
|
+
|
16
|
+
class WalrusGrammar
|
17
|
+
|
18
|
+
class BasicChild < BasicParent
|
19
|
+
|
20
|
+
def template_body
|
21
|
+
|
22
|
+
super # (invoked automatically due to Extends directive)
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
def footer
|
27
|
+
accumulate('This is the overridden footer. Note that in the overridden version of the footer' + "\n") # RawText
|
28
|
+
accumulate('I\'m using a ') # RawText (continued)
|
29
|
+
accumulate("#") # EscapeSequence
|
30
|
+
accumulate('def block rather than a ') # RawText
|
31
|
+
accumulate("#") # EscapeSequence
|
32
|
+
accumulate('block like in the parent template. The' + "\n") # RawText
|
33
|
+
accumulate('reason for this is that ') # RawText (continued)
|
34
|
+
accumulate("#") # EscapeSequence
|
35
|
+
accumulate('block calls automatically in-line their contents at' + "\n") # RawText
|
36
|
+
accumulate('the point where they are declared.' + "\n") # RawText (continued)
|
37
|
+
accumulate('' + "\n") # RawText (continued)
|
38
|
+
accumulate('Given that this template ') # RawText (continued)
|
39
|
+
accumulate("#") # EscapeSequence
|
40
|
+
accumulate('extends the parent, the parent will *already* be' + "\n") # RawText
|
41
|
+
accumulate('in-lining the footer, so there is no need to in-line it again.' + "\n") # RawText (continued)
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
if __FILE__ == $0 # when run from the command line the default action is to call 'run'
|
46
|
+
new.run
|
47
|
+
end
|
48
|
+
|
49
|
+
end # BasicChild
|
50
|
+
|
51
|
+
end # WalrusGrammar
|
52
|
+
|
53
|
+
end # Walrus
|
54
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated Fri Apr 13 16:10:51 +0200 2007 by Walrus version 0.1
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubygems'
|
6
|
+
rescue LoadError
|
7
|
+
# installing Walrus via RubyGems is recommended
|
8
|
+
# otherwise Walrus must be installed in the RUBYLIB load path
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'walrus/document'
|
12
|
+
|
13
|
+
module Walrus
|
14
|
+
|
15
|
+
class WalrusGrammar
|
16
|
+
|
17
|
+
class BasicParent < Document
|
18
|
+
|
19
|
+
def template_body
|
20
|
+
|
21
|
+
accumulate('This is the base template which subclasses will inherit.' + "\n") # RawText
|
22
|
+
accumulate('' + "\n") # RawText (continued)
|
23
|
+
lookup_and_accumulate_placeholder(:footer)
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def footer
|
28
|
+
accumulate('This is the footer for the base template.' + "\n") # RawText
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
if __FILE__ == $0 # when run from the command line the default action is to call 'run'
|
33
|
+
new.run
|
34
|
+
end
|
35
|
+
|
36
|
+
end # BasicParent
|
37
|
+
|
38
|
+
end # WalrusGrammar
|
39
|
+
|
40
|
+
end # Walrus
|
41
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
#import 'basic_parent'
|
2
|
+
This time we use an \#import directive rather than an \#extends.
|
3
|
+
|
4
|
+
This means that we have access to all of the methods defined in the parent,
|
5
|
+
but the main "template_body" is not explicitly called.
|
6
|
+
|
7
|
+
Here we'll call in the parent's footer:
|
8
|
+
$footer
|
@@ -0,0 +1,7 @@
|
|
1
|
+
This time we use an #import directive rather than an #extends.
|
2
|
+
|
3
|
+
This means that we have access to all of the methods defined in the parent,
|
4
|
+
but the main "template_body" is not explicitly called.
|
5
|
+
|
6
|
+
Here we'll call in the parent's footer:
|
7
|
+
This is the footer for the base template.
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated Fri Apr 13 16:10:52 +0200 2007 by Walrus version 0.1
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubygems'
|
6
|
+
rescue LoadError
|
7
|
+
# installing Walrus via RubyGems is recommended
|
8
|
+
# otherwise Walrus must be installed in the RUBYLIB load path
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'walrus/document'
|
12
|
+
require File.join(File.dirname(__FILE__), 'basic_parent').to_s
|
13
|
+
|
14
|
+
module Walrus
|
15
|
+
|
16
|
+
class WalrusGrammar
|
17
|
+
|
18
|
+
class ImportingChild < BasicParent
|
19
|
+
|
20
|
+
def template_body
|
21
|
+
|
22
|
+
accumulate('This time we use an ') # RawText
|
23
|
+
accumulate("#") # EscapeSequence
|
24
|
+
accumulate('import directive rather than an ') # RawText
|
25
|
+
accumulate("#") # EscapeSequence
|
26
|
+
accumulate('extends.' + "\n") # RawText
|
27
|
+
accumulate('' + "\n") # RawText (continued)
|
28
|
+
accumulate('This means that we have access to all of the methods defined in the parent,' + "\n") # RawText (continued)
|
29
|
+
accumulate('but the main "template_body" is not explicitly called.' + "\n") # RawText (continued)
|
30
|
+
accumulate('' + "\n") # RawText (continued)
|
31
|
+
accumulate('Here we\'ll call in the parent\'s footer:' + "\n") # RawText (continued)
|
32
|
+
lookup_and_accumulate_placeholder(:footer)
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
if __FILE__ == $0 # when run from the command line the default action is to call 'run'
|
38
|
+
new.run
|
39
|
+
end
|
40
|
+
|
41
|
+
end # ImportingChild
|
42
|
+
|
43
|
+
end # WalrusGrammar
|
44
|
+
|
45
|
+
end # Walrus
|
46
|
+
|
@@ -0,0 +1,8 @@
|
|
1
|
+
#import '../basic_parent'
|
2
|
+
We have to use a different form of the \#import directive when working
|
3
|
+
within a subdirectory. Instead of providing a class name we pass a
|
4
|
+
quoted string literal with relative path information. In this way Walrus
|
5
|
+
knows where to find the parent template.
|
6
|
+
|
7
|
+
Here we'll call in the parent's footer:
|
8
|
+
$footer
|
@@ -0,0 +1,7 @@
|
|
1
|
+
We have to use a different form of the #import directive when working
|
2
|
+
within a subdirectory. Instead of providing a class name we pass a
|
3
|
+
quoted string literal with relative path information. In this way Walrus
|
4
|
+
knows where to find the parent template.
|
5
|
+
|
6
|
+
Here we'll call in the parent's footer:
|
7
|
+
This is the footer for the base template.
|
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Generated Fri Apr 13 16:10:52 +0200 2007 by Walrus version 0.1
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'rubygems'
|
6
|
+
rescue LoadError
|
7
|
+
# installing Walrus via RubyGems is recommended
|
8
|
+
# otherwise Walrus must be installed in the RUBYLIB load path
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'walrus/document'
|
12
|
+
require File.join(File.dirname(__FILE__), '..', 'basic_parent').to_s
|
13
|
+
|
14
|
+
module Walrus
|
15
|
+
|
16
|
+
class WalrusGrammar
|
17
|
+
|
18
|
+
class ImportingChildInSubdirectory < BasicParent
|
19
|
+
|
20
|
+
def template_body
|
21
|
+
|
22
|
+
accumulate('We have to use a different form of the ') # RawText
|
23
|
+
accumulate("#") # EscapeSequence
|
24
|
+
accumulate('import directive when working' + "\n") # RawText
|
25
|
+
accumulate('within a subdirectory. Instead of providing a class name we pass a' + "\n") # RawText (continued)
|
26
|
+
accumulate('quoted string literal with relative path information. In this way Walrus' + "\n") # RawText (continued)
|
27
|
+
accumulate('knows where to find the parent template.' + "\n") # RawText (continued)
|
28
|
+
accumulate('' + "\n") # RawText (continued)
|
29
|
+
accumulate('Here we\'ll call in the parent\'s footer:' + "\n") # RawText (continued)
|
30
|
+
lookup_and_accumulate_placeholder(:footer)
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
if __FILE__ == $0 # when run from the command line the default action is to call 'run'
|
36
|
+
new.run
|
37
|
+
end
|
38
|
+
|
39
|
+
end # ImportingChildInSubdirectory
|
40
|
+
|
41
|
+
end # WalrusGrammar
|
42
|
+
|
43
|
+
end # Walrus
|
44
|
+
|
File without changes
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#*
|
2
|
+
|
3
|
+
Another multiline comment
|
4
|
+
|
5
|
+
Note that I can use anything I want inside comments:
|
6
|
+
|
7
|
+
* Tabs
|
8
|
+
* Non-existent #directives
|
9
|
+
* Real directives like #raw, #set, #super, #def and #import
|
10
|
+
* Placeholders: $hello("world")
|
11
|
+
* Escape sequences: \n\r
|
12
|
+
* Nested comments: ## here is a single-line one
|
13
|
+
* Nested comments: #* here is a multi-line one *#
|
14
|
+
|
15
|
+
*#
|
@@ -0,0 +1,57 @@
|
|
1
|
+
This example demonstrates a number of different uses of the #raw directive.
|
2
|
+
In this paragraph if I want to use characters that have a special meaning for
|
3
|
+
Walrus then I have to escape them (example, a $placeholder, a #directive, an
|
4
|
+
\$ escape sequence).
|
5
|
+
|
6
|
+
But this paragraph is different, it is inside a #raw block.
|
7
|
+
I can do anything at all in the #raw block without having to escape it.
|
8
|
+
For example, use Walrus directives:
|
9
|
+
#super, #set a = b
|
10
|
+
Use placeholders:
|
11
|
+
$a, $b, $c
|
12
|
+
Use backslashes:
|
13
|
+
\n, \t, \m, \n, \o
|
14
|
+
|
15
|
+
This paragraph is another example where the closing marker is not
|
16
|
+
on a new line of it's own...
|
17
|
+
This is an example where I use an explicit directive-closing marker (#) so that
|
18
|
+
I can start my #raw content on the same line as the opening directive. I can do the
|
19
|
+
same trick with the closing directive so that my text can continue on on the same
|
20
|
+
line... See?
|
21
|
+
|
22
|
+
This paragraph uses a "here document". That means I can include a literal #end directive
|
23
|
+
in it without it causing the block to come to an end. Here we see the block continuing
|
24
|
+
and I can still use $placeholders and #directives without them having any special meaning.
|
25
|
+
The end marker (in this case "HERE") must be the first and last thing on the line in order
|
26
|
+
for it to be detected. All other uses of the end marker go through literally with no
|
27
|
+
special meaning.
|
28
|
+
|
29
|
+
There is no way to include a literal end directive in a #raw block without the help of
|
30
|
+
a "here document". You can't escape the end directive for example, because the escape
|
31
|
+
character (\) has no special meaning in a #raw block. Notice that if I try it it won't
|
32
|
+
work:\
|
33
|
+
I am now outside the #raw block because the #end directive was interpreted as an end marker
|
34
|
+
despite my attempt to escape it.
|
35
|
+
|
36
|
+
This is an example of an alternative "here document" syntax. The hyphen means that you can
|
37
|
+
precede the end marker with whitespace. Note that if the marker (in this case "THERE") is
|
38
|
+
preceded by non-whitespace characters on the same line then it has no special meaning: THERE
|
39
|
+
Likewise, if it is followed by such characters then it has no meaning either....
|
40
|
+
THERE... we keep going because "THERE" wasn't the last thing on the line.
|
41
|
+
|
42
|
+
Trailing whitespace is acceptable after the end marker, but it is not included in the output.
|
43
|
+
|
44
|
+
The same is true when using the alternative syntax.
|
45
|
+
|
46
|
+
In fact, trailing whitespace is acceptable when first opening the here document too, but it
|
47
|
+
is ignored
|
48
|
+
|
49
|
+
THe same is true for the alternate syntax.
|
50
|
+
|
51
|
+
Note that when using the alternative "here document" syntax the optional whitespace before the
|
52
|
+
end marker truly is optional; that is, the end marker can be the first thing on the line if
|
53
|
+
you want it to. (Although if that's the case you may as well use the first syntax.)
|
54
|
+
|
55
|
+
In this example I am going to use some multi-byte characters:
|
56
|
+
€áéíóú
|
57
|
+
àèìòù
|