# NAME

App::Followme - Simple static web site maintenance

# SYNOPSIS

    use App::Followme qw(followme);
    followme();

# DESCRIPTION

Followme does three things. First, it updates the constant portions of each web
page when it is changed on any page. Second, it converts text files into html
using a template. Third, it creates indexes for files when they are placed in a
special directory, the archive directory. This simplifies keeping a blog on a
static site. Each of these three actions are explained in turn.

Each html page has sections that are different from other pages and other
sections that are the same. The sections that differ are enclosed in html
comments that look like

    <!-- section name-->
    <!-- endsection name -->

and indicate where the section begins and ends. When a page is changed, followme
checks the text outside of these comments. If that text has changed. the other
pages on the site are also changed to match the page that has changed. Each page
updated by substituting all its named blocks into corresponding block in the
changed page. The effect is that all the text outside the named blocks are
updated to be the same across all the html pages.

Block text will be synchronized over all files in the folder if the begin
comment has "per folder" after the name. For example:

    <!-- section name per folder -->
    <!-- endsection name -->

Text in "per folder" blocks can be used for navigation or other sections of the
page that are constant, but not constant across the entire site.

If there are any text files in the directory, they are converted into html files
by substituting the content into a template. After the conversion the original
file is deleted. Along with the content, other variables are calculated from the
file name and modification date. Variables in the template are surrounded by
double braces, so that a link would look like:

    <li><a href="{{url}}">{{title}}</a></li>

The string which indicates a variable is configurable. The variables that are
calculated for a text file are:

- body

    All the content of the text file. The content is passed through a subroutine
    before being stored in this variable. The subroutine takes one input, the
    content stored as a string, and returns it as a string containing html. The
    default subroutine, add\_tags in this module, only surrounds paragraphs with
    p tags, where paragraphs are separated by a blank line. You can supply a
    different subroutine by changing the value of the configuration variable
    page\_converter.

- title

    The title of the page is derived from the file name by removing the filename
    extension, removing any leading digits,replacing dashes with spaces, and
    capitalizing the first character of each word.

- url

    The relative url of the resulting html page. 

- time fields

    The variables calculated from the modification time are: `weekday, month,`
    `monthnum, day, year, hour24, hour, ampm, minute,` and `second.`

The template for the text file is selected by first looking for a file in
the same directory starting with the same name as the file, e.g.,
index\_template.html for index.html. If not found, then a file named
template.html in the same directory is used. If neither is found, the same
search is done in the directory above the file, up to the top directory of
the site.

As a final step, followme builds indexes for each directory in the archive
directory. Each directory gets an index containing links to all the files and
directories contained in it. And one index is created from all the most
recently changed files in the archive directory. This index thus serves as a
weblog. Both kinds of index are built using a template. The variables are
the same as mentioned above, except that the body variable is set to the
block inside the content comment. Loop comments that look like

    <!-- loop -->
    <!-- endloop -->

indicate the section of the template that is repeated for each file contained
in the index. 

# CONFIGURATION

Followme is called with the function followme, which takes one or no argument.

    followme($directory);
    

The argument is the name of the top directory of the site. If no argument is
passed, the current directory is taken as the top directory. Before calling
this function, it can be configured by calling the function configure\_followme.

    configure_followme($name, $value);

The first argument is the name and the second the value of the configuration
parameter. All parameters have scalar values except for page-converter and
variable\_setter, whose values are references to a function. The configuration
parameters all have default values, which are listed below with each parameter.

- absolute\_url (`0`)

    If Perl-true, urls on generated index pages are absolute (start with a slash.)
    If not, they are relative to the index page. Typically, you want absolute urls
    if you have a base tag in your template and relative otherwise.

- text\_extension (`txt`)

    The extension of files that are converted to html.

- archive\_index\_length (`5`)

    The number of recent files to include in the weblog index.

- archive\_index (`blog.html`)

    The filename of the weblog index.

- archive\_directory (`archive`)

    The name of the directory containing the weblog entries.

- body\_tag (`content`)

    The comment name surrounding the weblog entry content.

- variable (`{{*}}`)

    The string which indicates a variable in a template. The variable name replaces
    the star in the pattern.

- page\_converter (`add_tags`)

    A reference to a function use to convert text to html. The function should
    take one argument, a string containing the text to be converted and return one
    value, the converted text.

- variable\_setter (`set_variables`)

    A reference to a function that sets the variables that will be substituted
    into the templates, with the exception of body, which is set by page\_converter.
    The function takes one argument, the name of the file the variables are
    generated from, and returns a reference to a hash containing the variables and
    their values.

# LICENSE

Copyright (C) Bernie Simon.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

# AUTHOR

Bernie Simon <bernie.simon@gmail.com>