SYNOPSIS

DESCRIPTION

mowyw is a text processor for building static websites. It supports includes, menus, external datasources (like XML files or databases) and syntax hilighting.

To use mowyw you need three directories called source, online and includes. source holds the source files that are to be interpreted by mowyw. When you run mowyw, it will walk (recursively) through the source dir, and for each file it either copies it verbatimely to online, or, if the file looks like HTML (ends on .html, .shtml, .htm etc.) it is processed by mowyw, and the output is written into the online dir.

In includes/ are include files (how surprising), header, footer, global include files, and optionally data source files.

You should always execute mowyw from the parent directory of these three directories.

The name of these three directories can be overridden with command line options.

COMMAND LINE OPTIONS

PROCESSING ORDER

mowyw processes files in several steps:

MARKUP

Normal text (including HTML markup) is copied verbatimely to the output file.

Special directives are delimited either with [% … %] (preferred) or with [[[ … ]]] (deprecated, but still supported for compatibility).

Many elements take options, which are usually whitespace delimited, for example [% 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:

The following block elements are supported:

MENUES

mowyw has special menu support. To define a menu named foo, create a file 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>

Now in your index page you can include that menu with the directive [% menu home %]. This will produce the menu contents with the markup stripped, and insde the home all of the contents will appear, the other menu items only contribute the parts that are not enclosed in double curly braces.

Menus can ben nested, a nested menu entry can be accessed for example with [% menu sec subitem1 %].

It's best to take a look at the examples in the distribution, which should nicely illustrate the menu mechanism.

OPTIONS

Currently only two options are supported, no-header and no-footer. If they are set in a file via [% option no-header %], the inclusion of header or footer files will be omitted.

DATA SOURCES

You can access external data sources by first bind'ing a variable to a data source, and then iterating with a for loop over that source.

This is best illustrated with a short example.

File 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 (it doesn't have any more options). It 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 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:

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).

CONFIGURATION FILE

Mowyw tries to read a file called mowyw.conf. Within that file you can configure pathes and file names on a per-file base.

An example config file might look like this:

MATCH[german]    = \.de
POSTFIX[german]  = .de
MATCH[english]   = \.en
POSTFIX[english] = .en

This defines two sections called "german" and "english". If a file matches the regular expression \.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 source/index.html.de, the header file will be includes/header.de, a menu foo will be searched for in file includes/menu-foo.de etc.

This configuration mechanism is primarily intented for creating mutilingual sites, but might be useful for other things as well.

RESOURCES

If something isn't clear to you, please take a look into the README file and the examples in the source tarball. If that doesn't answer your questions, don't hesitate to contact the author.

The official website can be found here: Mowyw homepage.

BUGS AND LIMITATIONS

mowyw was written to get its author's job done, and it does that well. While it was written with generality in mind, there are still some restrictions that were accepted as a tradeoff for simplicity.

AUTHOR

Written by Moritz Lenz moritz@faui2k3.org.

COPYRIGHT

Copyright 2006 - 2008 by Moritz Lenz.

This is free software. You may redistribute copies of it under the terms of the GNU General Public License, Version 2.1 or 3 (choose the one you prefer).

There is NO WARRANTY, to the extent permitted by law.