App::DocKnot::Spin - Static site builder supporting thread macro language
use App::DocKnot::Spin;
my $spin = App::DocKnot::Spin->new({ delete => 1 });
$spin->spin('/path/to/input', '/path/to/output');
Perl 5.24 or later and the modules Git::Repository, Image::Size,
List::SomeUtils, Path::Iterator::Rule, Path::Tiny, Pod::Thread, Template (part
of Template Toolkit), and YAML::XS, all of which are available from CPAN. Also
expects to find
faq2html,
cvs2xhtml, and
cl2xhtml on the
user's PATH to convert certain types of files.
App::DocKnot::Spin is a static site builder that takes an input tree of files
and generates an output HTML site. It is built around the macro language
thread, which is designed for writing simple HTML pages using somewhat nicer
syntax, catering to my personal taste, and supporting variables and macros to
make writing pages less tedious.
Each file in the input tree is examined recursively and either copied verbatim
to the same relative path in the output tree (the default action), used as
instructions to an external program, or converted to HTML. When converted to
HTML, the output file will be named the same as the input file except the
extension will be replaced with ".html". Missing directories are
created.
If the timestamp of the output file is the same as or newer than the timestamp
of the input file, it will be assumed to be up-to-date and will not be
regenerated. This optimization makes updating an existing static site much
quicker.
Most files in the input tree will normally be thread files ending in
".th". These are processed into HTML using
App::DocKnot::Spin::Thread. See that module's documentation for the details of
the thread macro language.
Files that end in various other extensions are taken to be instructions to run
an external converter on a file. The first line of such a pointer file should
be the path to the source file, the second line any arguments to the
converter, and the third line the style sheet to use if not the default. Which
converter to run is based on the extension of the file as follows:
.changelog cl2xhtml
.faq faq2html
.log cvs log <file> | cvs2xhtml
.rpod Pod::Thread
All other files not beginning with a period are copied as-is, except that files
or directories named
CVS,
Makefile, or
RCS are ignored.
As an exception,
.htaccess files are also copied. This list of
exclusions can be added to with the "exclude" constructor argument.
If there is a file named
.sitemap at the top of the input tree, it will
be parsed with App::DocKnot::Spin::Sitemap and used for inter-page links and
the "\sitemap" thread command. See that module's documentation for
the format of this file.
If there is a file named
.versions at the top of the input tree, it will
be parsed with App::DocKnot::Spin::Versions and used to determine when to
regenerate certain pages and for the "\release" and
"\version" thread commands. See that module's documentation for the
format of this file.
If there is a file named
.rss in any directory of the input tree,
spin-rss will be run on that file, passing the
-b option to
point to the directory about to be processed. This is done before processing
the files in that directory, so
spin-rss can create or update files
that will then be processed as normal.
If there is a directory named
.git at the top of the input tree,
App::DocKnot::Spin will assume that the input tree is a Git repository and
will try to use "git log" to determine the last modification date of
files.
- new(ARGS)
- Create a new App::DocKnot::Spin object. ARGS should be a
hash reference with one or more of the following keys:
- delete
- If set to a true value, after populating the output tree
with the results of converting or copying all the files in the source
tree, delete all files and directories in the output tree that do not have
a corresponding file in the source tree.
- exclude
- A list of strings, interpreted as regular expressions,
which match files to exclude from processing. These patterns will be added
to a built-in list of exclude patterns.
- style-url
- The base URL for style sheets. A style sheet specified in a
"\heading" command will be considered to be relative to this URL
and this URL will be prepended to it. If this option is not given, the
name of the style sheet will be used verbatim as its URL, except with
".css" appended.
- spin(INPUT, OUTPUT)
- Build the source tree rooted at INPUT into an HTML static
site, storing it in the directory OUTPUT. If OUTPUT does not exist, it
will be created.
Russ Allbery <
[email protected]>
Copyright 1999-2011, 2013, 2021-2022 Russ Allbery <
[email protected]>
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES
OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
cl2xhtml(1),
cvs2xhtml(1),
docknot(1),
faq2html(1),
spin-rss(1), App::DocKnot::Spin::Sitemap, App::DocKnot::Spin::Thread,
App::DocKnot::Spin::Versions, Pod::Thread
This module is part of the App-DocKnot distribution. The current version of
DocKnot is available from CPAN, or directly from its web site at
<
https://www.eyrie.org/~eagle/software/docknot/>.