## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.
#title( 'AlternatorTool' )
<p>
$text.demo.thisPage.insert("#doclink( 'AlternatorTool' true )").
#set( $toollink = $doclink )
$text.alternator.intro.insert("#doclink( 'Alternator' true )")
</p>

## The demo.vm template expects the following values to be set
#set( $toolname = 'alternator' )
#set( $toolclass = $alternator.class )
#set( $toolDemo = 
"${esc.h}set( ${esc.d}color = ${esc.d}alternator.auto('red', 'blue') )
${esc.h}${esc.h} use manual alternation for this one
${esc.h}set( ${esc.d}style = ${esc.d}alternator.manual(['hip','fly','groovy']) )
${esc.h}foreach( ${esc.d}i in [1..5] )
 Number ${esc.d}i is ${esc.d}color and ${esc.d}style. I dig $style.next numbers.
${esc.h}end"
)

#parse( 'demo.vm' )
