App-Basis-ConvertText2
view release on metacpan or search on metacpan
text-decoration: none ;
color: black;
}
/* tables*/
table { page-break-inside: avoid ;}
table.footer { font-size: 10px; width: 100%;}
table.footer td.commercial {
font-weight: bold;
font-size: 12px;
text-align: center;
}
/* nice markup for source code */
table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode {
margin: 0; padding: 0; vertical-align: baseline; border: none;
}
table.sourceCode { width: 100%; line-height: 100%; }
td.lineNumbers { text-align: right; padding-right: 4px; padding-left: 4px; color: #aaaaaa; border-right: 1px solid #aaaaaa; }
td.sourceCode { padding-left: 5px; }
code > span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }
</style>
</head>
<body>
<h1>%TITLE%</h1>
<!-- uncomment this if you need a Table of Contents -->
<!-- <div id='toc' >
%TOC%
</div> -->
%_CONTENTS_%
<table class='footer' width='100%'>
<tr><td>(c) %COPYRIGHT%</td><td align='right'>%DATE%</td>
</table>
</body>
</html>
EOD
# -----------------------------------------------------------------------------
sub other_debug {
my ( $state, $debug ) = @_;
# return if ( $state ne 'DEBUG' );
my $msg = $state;
$msg .= " $debug" if ($debug);
say STDERR localtime() . " " . get_program() . " $msg";
}
# -----------------------------------------------------------------------------
sub create_defaults {
my ( $dir, $verbose ) = @_;
my $default = "$dir/templates/default";
my ( $r, $o, $e );
die "dir option required" if ( !$dir );
if ( !-d $default ) {
# create the defaults if they do not exist
try { path($default)->mkpath } catch {};
msg_exit("Could not create default templates dir in $dir") if ( !-d $default );
}
# create HTML template
path("$default/template.html")->spew_utf8($TEMPLATE) if ( !-f "$default/template.html" );
my $config = App::Basis::Config->new( filename => "$default/config" );
# if there is no data in the config then lets create some
if ( !$config->has_data() ) {
$config->set( '/page/size', 'A4' );
$config->set( '/page/orientation', 'Portrait' );
my $author = getpwuid($>);
$config->set( '/author', $author );
$config->set( '/copyright', "Property of $author 2014" );
$config->store();
}
}
# -----------------------------------------------------------------------------
sub read_settings {
my ( $template, $dir ) = @_;
my %settings;
die "dir option required" if ( !$dir );
$template ||= 'default';
$template =~ s/\v//g;
my $templatedir = "$dir/templates/$template";
if ( !-d $templatedir ) {
debug( "INFO", "Template '$template' does not exist, using default" );
$templatedir = "$dir/templates/default";
}
$settings{config} = App::Basis::Config->new( filename => "$templatedir/config" );
$settings{template} = $template;
$settings{template_dir} = $templatedir;
$settings{template} = path("$templatedir/template.html")->slurp_utf8;
return \%settings;
}
# -----------------------------------------------------------------------------
# main
# get any template from the stop of the story
my $settings;
my ($template) = ( $story =~ /^template:\s?(.*?)$/sm );
# document template overwritten by the command line option
$template = $opt{template} if ( $opt{template} );
$settings = read_settings( $template, $opt{config_dir} );
# add in template defaults if needed
$replace->{DATE} ||= strftime( "%Y-%m-%d", gmtime() );
$replace->{COPYRIGHT} ||= $settings->{config}->get("copyright");
$replace->{AUTHOR} ||= $settings->{config}->get("author");
$replace->{PAGE_SIZE} ||= $settings->{config}->get("page/size");
$replace->{ORIENTATION} ||= $settings->{config}->get("page/orientation");
my $format = App::Basis::ConvertText2->new(
name => get_program(),
basedir => $basedir,
use_cache => 1,
cache_dir => $CACHE_DIR,
template => $settings->{template},
replace => $replace,
verbose => $opt{verbose},
embed => $opt{embed},
);
$format->clean_cache() if ( $opt{clean} );
# be in the same dir as the input file in case there are an files in plugins
# that act on relative paths
my $current = Path::Tiny->cwd;
chdir($basedir);
my $data = $format->parse($story);
# decide on output filename from any format keyword
# all the keywords are in UPPER-CASE
my $keywords = $format->replace;
if ( !$opt{output} && $keywords->{FORMAT} ) {
# same name as input
$opt{output} = $opt{filename};
# change extension
$opt{output} =~ s/\.md$/.$keywords->{FORMAT}/i;
}
if ( $opt{output} ) {
my $pdfconvertor;
if ( $opt{prince} ) {
$pdfconvertor = 'prince';
}
elsif ($opt{wkhtmltopdf}) {
$pdfconvertor = 'wkhtmltopdf';
}
my $status = $format->save_to_file( $opt{output}, $pdfconvertor);
if ( $opt{verbose} && $status ) {
say "Created $opt{output}";
}
elsif ( !$status ) {
say "Failed to create $opt{output}";
}
}
else {
say STDERR "Ignoring $opt{filename}, could not determine a filename to output to, no :format option in file?" if ( $opt{verbose} );
}
# return to where we came from
chdir($current);
( run in 0.479 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )