#!/usr/bin/perl use v5.18; # needed for \h (horizontal whitespace) in regexes use strict; use warnings; use autodie; use List::Util qw(pairs); use Config::Tiny; use Path::Tiny; use Text::Hogan::Compiler; =head1 NAME mkdocs-prep - mkdocs preprocessor expanding inline hints and mustache tokens =head1 VERSION Version 0.02 =head1 SYNOPSIS =head1 DESCRIPTION B prepares a markdown document for B processing. The document is converted using inline hint section to a mustache template and resolved using an external set of single-word tokens. A document section named "Special strings" is parsed for token definitions where each line lists a single-word token, a colon, and default string. The section is then stripped, and all occurences of default strings are replaced with tokens wrapped with double curly brackets. Template tokens are gathered from external config file F, where each line lists a token, an equals sign, and replacement string. Each token in the document, wrapped with double curly brackets {{like_this}}, is replaced (including brackets) with corresponding string. =cut my ( $infile, $outfile ) = @ARGV; my $config = Config::Tiny->new; $config = Config::Tiny->read( 'site.mk', 'utf8' ); my $content = path($infile)->slurp_utf8; $content =~ s/^#+\s*Special strings\s*\n((?:\n|[^#\n][^\n]*\n)*)//m; my $section = $1 || ''; my %defaults; while ( $section =~ /^(\w+)\h*:\h*(\w+(?:\h+\w+)*)/mg ) { my $token = $1; my $string = $2; $content =~ s/\Q$string\E/{{$token}}/g; }; my $compiler = Text::Hogan::Compiler->new; my $template = $compiler->compile($content); path($outfile)->spew_utf8( $template->render( $config->{_} ) ); 1;