[article Template 1.7
    [quickbook 1.7]
]

[section Templates]

[/-------------------------------- nullary arg ]

[template foo0 nullary_arg]

[foo0]

[/-------------------------------- unary arg, phrase syle ]

[template foo1[bar] foo [bar]]

[foo1 baz]

[/-------------------------------- unary arg, block syle ]

[template foo2[bar]
foo [bar]
]

[foo2 baz]

[template foo3[bar]
This is a complete paragraph. [bar] [bar] [bar] [bar] [bar]
[bar] [bar] [bar] [bar].... blah blah blah......
]

[foo3 kalamazoo]

[/-------------------------------- unary arg, using punctuation ]

[template |[bar] '''<hey>'''[bar]'''</hey>''']

[|baz]

[/-------------------------------- recursive templates ]

[template foo4[bar]
[foo3 [bar]]
]

[foo3 madagascar]

[template foo5[x] zoom [x]]
[template foo6[x] [x] zoom]

[foo6[foo5 peanut]]

[template kinda_weird[x y] [x] [y]]

[kinda_weird exactly..xanadu]


[/-------------------------------- space delimitted args ]

[template simple1[a b] [a][b]]

[simple1 w x]

[template simple2[a b c d] [a][b][c][d]]

[simple2 w x y z][simple2 w x y z trail]

[/-------------------------------- John's templates ]

[template code[x]
    int main()
    {
        std::cout << ``[x]`` << std::endl;
    }
]

[code "Hello\, World"]

[template alpha '''&alpha;''']
[template pow[a b] [a]'''<superscript>'''[b]'''</superscript>''' ]
[template super[text]'''<superscript>'''[text]'''</superscript>''' ]

[pow x 2]

[pow [alpha] 2]

x[super 2]

[/-------------------------------- Some more ]

[template banana got a banana?]
[template plantation[bananarama] [bananarama]]

[plantation [banana]]

[/-------------------------------- Not a bug (there was a syntax error here) ]

[template join1[a b] [b][a]]
[template join2[a b] [a][b]]
[template test[x] [join1 [join2 0 [x]]...0]]
[test 0]

[/-------------------------------- Mismatched template ]

[template foo 1]
[fool]

[template blah 10]

[endsect]

[section Empty Templates]

[template empty1]
[template empty2 ]
[template empty3 [/comment]]
[template empty4 [/comment]

]
[template empty5
]
[template empty6

]
[template empty7
[/comment]
]
[template empty8

[/comment]
]
[template empty_arg1[x]]
[template empty_arg2[x y]]

[empty1]
[empty2]
[empty3]
[empty4]
[empty5]
[empty6]
[empty7]
[empty8]
[empty_arg1 1]
[empty_arg2 1 2]

[endsect]

[/----------------------------------- Nested templates ]

[section Nested Templates]

[template block_foo[content]

Start block template.

[content]

End block template.
]

[template phrase_foo[content] Start phrase template. [content] End phrase template.]

Pre [block_foo [block_foo Hello!]] Post

Pre [block_foo [phrase_foo Hello!]] Post

Pre [phrase_foo [block_foo Hello!]] Post

Pre [phrase_foo [phrase_foo Hello!]] Post

[endsect]

[/----------------------------------- Block Markup ]

[section Block Markup]

[template list
* a
* b]

[template horizontal
----]

[template codeblock
    int main() {}]

[template paragraphs
Paragraphs 1

Paragraphs 2
]

[list][horizontal][codeblock][paragraphs]

* [list]
* [horizontal]
* [codeblock]
* [paragraphs]

[endsect]

[/----------------------------------- 1.5+ use static scoping ]

[section Static Scoping]

[template x static scoping]
[template static_test1[] [x]]
[template static_test2[x] [static_test1]]
[static_test2 dynamic scoping]

[/ This should be '[a]' because [a] isn't matched. ]
[template test1[] [a]]
[template test2[a] [test1]]
[test2 1]

[/ In 1.5 template arguments are scoped at the point they are defined]

[template y new]
[template static_test3[a y] [a]]
[static_test3 [y] old]

[/ From https://svn.boost.org/trac/boost/ticket/2034 ]

[template same[x] [x]]
[template echo[a b] [a] [b]]
[template echo_twice[x] [echo [same [x]]..[same [x]]]]
[echo_twice foo]

[endsect]

[/----------------------------------- 1.5+ template arguments ]

[section Template Arguments]

[template binary[x y] {[x]-[y]}]
[binary 1..2]     [/ {1-2} ]
[binary 1 2]      [/ {1-2} ]
[binary 1..2 3 4] [/ {1-2 3 4} ]
[binary 1 2..3 4] [/ {1 2-3 4} ]
[binary 1 2 3..4] [/ {1 2 3-4} ]
[binary 1.\.2..3] [/ {1..2-3} ]
[binary 1.\.2 3]  [/ {1..2-3} ]

[binary [binary 1 2..3]..4] [/ { {1 2-3}-4} ]
[binary [binary 1 2..3] 4] [/ { {1 2-3}-4} ]
[binary [binary 1 2 3]..4] [/ { {1-2 3}-4} ]

[binary \[1 2\] 3] [/ {[1-2] 3} ]
[binary \[1..2\] 3] [/ {[1-2] 3} ]
[binary \[1 2] [/ {(1-2} ]

[template ternary[x y z] {[x]-[y]-[z]}]
[ternary 1..2..3]  [/ {1-2-3} ]
[ternary 1 2 3]    [/ {1-2-3} ]

[endsect]

[/----------------------------------- Block and phrases ]

[section Block and phrase templates]

[template phrase_template[] Some *text*]
[template block_template[]

A <emphasis>paragraph</emphasis>.
]

[phrase_template]
[block_template]
[`phrase_template]
[`block_template]

[/ Trailing newline shouldn't be included]

[template named_index[type title]
'''<index type="'''[type]'''"><title>'''[title]'''</title></index>'''
]

[named_index things Things]

[/ Blocks in phrase templates ]

[template phrase_block1[] [table]]
[template phrase_block2[] [table] Text2 afterwards.]
[template phrase_block3[] Text3 before. [table]]
[template phrase_block4[] Text4 before. [table] Text4 afterwards.]
[template phrase_block5[] [table] * Not a list.]
[template phrase_block6[] [table]
* Not a list.]

[phrase_block1][phrase_block2][phrase_block3][phrase_block4]
[phrase_block5][phrase_block6]

[endsect]

[/-------------------------------- Skipping template body ]

[section:template_body Skipping the template body correctly]

[template args1[x] [`x]]
[template args2[] [ordered_list [``code``]]]
[/ Due to a bug in the template parser need to stop the parser
   thinking that the code is an escaped template. ]
[template args3[] [ordered_list [\ `code`]]]

[args1 <emphasis>Argument</emphasis>]
[args2]
[args3]

[endsect]

[/----------------------------------- Escaped templates ]

[section Escaped templates]

[template raw_markup <thingbob>Not real boostbook</thingbob>]
[template escaped1 [x] [`x]]

[`raw_markup]
[escaped1 <thingbob>More fake boostbook</thingbob>]

[endsect]
