App-Mowyw
view release on metacpan or search on metacpan
script/mowyw view on Meta::CPAN
the file C<includes/header> is processed and prepended to the current
output file
=item -
the file C<includes/footer> is processed and appended to the current
output file
=back
=back
=head1 MARKUP
Normal text (including HTML markup) is copied verbatimely to the output file.
Special directives are delimited either with C<[% ... %]> (preferred) or with
C<[[[ ... ]]]> (deprecated, but still supported for compatibility).
Many elements take options, which are usually whitespace delimited, for
example C<[% include includefile.html %]>.
Inline elements consist only of one tag, while block elements run until the
matching end tag.
The following inline elements are supported:
=over
=item
C<include> includes a file, and processes it. Example:
C<`[% include coypright.html %]>.
=item
C<menu> refers to a menu. See section L</MENUES> below.
=item
C<item> defines a menu item. See section L</MENUES> below.
=item
C<option> sets an option, for example C<[% option no-header %]>. See section
L</OPTIONS> below.
=item
C<comment> ignores everything up to the tag end. Example: C<[% comment this
comments appears nowhere in the output %]>.
=item
C<setvar> sets a variable. Example: C<[% setvar title Title of this page%]>.
=item
C<readvar> reads and outputs a variable. You can optionally specify an
escape mechanism. Example: C<< <h1>[% readvar title %]</h1> >> or
C<< [% readvar db.column escape:html %] >>.
=item
C<bind> binds a variable to a datasource. See section L</DATA SOURCES> below.
=back
The following block elements are supported:
=over
=item
C<verbatim> reads the file until it finds an C<endverbatim> tag. It expects a
marker, which must be present at the end tag as well. Everything inbetween
is taken verbatimly, i.e. it is not processed at all. Keywords are not
allowed as markers. Example:
C<[% verbatim foo %] Some [% non-processed %] markup [% endverbatim foo %]>
=item
C<syntax> uses vim(1) to do syntax hilighting. Expects the name of the
language or configuration as its only argument. Example: `<pre>[%syntax
perl%]print "Hello, world\n";[%endsyntax%]</pre>`. The pseudo-syntax
C<escape> HTML-escapes the string and doesn't to any other syntax
hilighting.
=item
C<for> iterates of a datasource. See section <<datasource,DATA SOURCES>>
below.
=item
C<ifvar> executes the block only if the variable is defined.
Example: C<[% ifvar title %]<h1>[%readvar title%]</h1>[% endifvar %]>.
=back
=head1 MENUES
mowyw has special menu support. To define a menu named C<foo>, create a file
C<source/menu-foo> with the following contents:
<h2>Your menu title</h2>
<ul>
[% item home <li><a {{class="active"}} href="/">Home</a></li> %]
[% item first <li><a {{class="active"}} href="/first">First</a></li> %]
[% item sec <li><a {{class="active"}} href="/sec/">First</a>
{{
[% comment this is a sub menu that will only be visible
inside the `sec' menu %]
[% item subitem1 <p>More menu markup</p> %]
[% item subitem2 <p>Even more menu markup</p> %]
}}
</li> %]
</ul>
(The menu name is purely for your internal use, it will appear nowhere in the
output)
Now in your index page you can include that menu with the directive
C<[% menu home %]>. This will produce the menu contents with the markup
stripped, and insde the C<home> all of the contents will appear, the other menu
items only contribute the parts that are B<not> enclosed in double curly
braces.
Menus can ben nested, a nested menu entry can be accessed for example with
C<[% menu sec subitem1 %]>.
It's best to take a look at the examples in the distribution, which should
nicely illustrate the menu mechanism.
=head1 SYNTAX HILIGHTING
Syntax hilighting requires vim (see L<http://www.vim.org/>) and
L<Text::VimColor> to be installed
(otherwise the code is just HTML escaped, not hilighted).
Since you can't tell vim which encoding a source file is in,
non-ASCII-characters might not survive the round trip to vim if the locales
don't fit. On my systems UTF-8 locales worked, everything else didn't. So use
with caution.
=head1 OPTIONS
Currently only two options are supported, C<no-header> and C<no-footer>.
If they are set in a file via C<[% option no-header %]>, the inclusion of
header or footer files will be omitted.
=head1 DATA SOURCES
You can access external data sources by first C<bind>'ing a variable to a
data source, and then iterating with a C<for> loop over that source.
This is best illustrated with a short example.
File C<includes/news.xml>:
<rootTag>
<item>
<headline>China buys Google</headline>
<status>April's fool joke</stoke>
<date>2007</date>
</item>
<item>
<headline>Perl and Python join forces: Larry Wall and Guido von
Rossum announce 'parrot'</headline>
<status>April's fool joke</stoke>
<date>Very old</date>
</item>
</rootTag>
Now you can access the contents of this XML file in your source files:
[% bind news_variable type:xml file:news.xml root:item %]
[% comment and iterate over news_variable %]
[% for i in news_variable %]
<h2>Breaking news: [% readvar i.headline %]</h2>
<p>Status: [% readvar i.status %]</p>
[% endfor %]
Data sources are handled via plugins. Currently XML and DBI are supported.
The XML source is explained by the example above. The only additional option
is 'limit', which can be set to a positive number and which limits the number
of iterations. This plugin is quite limited in that the file structure always
has be the
same: one root tag that contains a list of secondary tags, each of which many
only contain distinct tags. Nested tags might work, but aren't officially
supported.
DBI is perls generic database interface. You can use it to access a database.
This has some limitations, for example you can't reuse database connections,
so every C<bind> statement actually opens a database connection on its own.
For the brave, here is an example of how to use it:
[% bind my_db type:dbi dsn:DBI:mysql:database=yourdatabse;host=dbhost
username:your_db_user password:you_db_password encoding:latin1
sql:'SELECT headline, status FROM news LIMIT 10'
%]
[% for i in my_db %]
<h2>Breaking news: [% readvar i.headline escape:html %]</h2>
<p>Status: [% readvar i.status escape:html %]</p>
[% endfor %]
The options are as follows:
=over
=item
The C<dsn> option is the "data source name" that C<DBI>'s C<connect> method
accepts. It always starts with C<DBI:>, then followed by the driver name
like C<mysql> or C<Pg> (for Postgres) and the driver options.
=item
The C<encoding> option is optional and defaults to C<utf-8>. You can use
any character encoding here that Perl's cool C<Encode> module supports,
which is quite a many.
=item
the C<password> and C<username> options can be omitted if your database
doesn't ask for them
=back
This plugin may seem weird if you don't know Perl and its database module. If
that's the case, consider toying around with Perl and DBI first (it's really
worth a try).
=head1 CONFIGURATION FILE
Mowyw tries to read a file called C<mowyw.conf>. Within that file you can
configure include pathes and file names on a per-file base, and you can
specify which files should be processed.
An example config file might look like this:
MATCH[german] = \.de
POSTFIX[german] = .de
MATCH[english] = \.en
POSTFIX[english] = .en
INCLUDE[10] = \.xhtml$
EXCLUDE[50] = _private
The first part defines two sections called "german" and "english".
If a file matches the
regular expression C<\.de>, it is treated as being in section "german". All
include files will have the postfix '.de', which means that if a file is
called C<source/index.html.de>, the header file will be C<includes/header.de>, a
menu C<foo> will be searched for in file C<includes/menu-foo.de> etc.
This configuration mechanism is primarily intented for creating mutilingual
sites, but might be useful for other things as well.
The second part consists of C<INCLUDE> and C<EXCLUDE> statements with their
priority and the regex they match. Higher priority rules are tested first.
When a rule matches the file is either processed (in the case of an C<INCLUDE>
option) or just verbatimly copied (in case of an C<EXCLUDE> option).
( run in 2.258 seconds using v1.01-cache-2.11-cpan-75ffa21a3d4 )