App-Basis-ConvertText2
view release on metacpan or search on metacpan
#!/usr/bin/env perl
=head1 NAME
ct2
=head1 DESCRIPTION
Convert my modified version of markdown into various document formats
this will create a ~/.ct2 directory and add some files to it, such as your
basic config and the initial templates
$ ct2 --help
Syntax: ct2 [options] filename
About: Convert my modified markdown text files into other formats, by
default will create HTML in same directory as the input file, will only
process .md files.
If there is no output option used the output will be to file of same name
as the input filename but with an extension (if provided) from the
document, use format: keyword (pdf html doc).
[options]
-h, -?, --help Show help
-c, --clean Clean up the cache before use
-e, --embed Embed images into HTML, do not use this if
converting to doc/odt
-o, --output Filename to store the output as, extension will
control conversion
-p, --prince Convert to PDF using princexml, can handle
embedded images
-s, --template name of template to use
-v, --verbose verbose mode
-w, --wkhtmltopdf Convert to PDF using wkhtmltopdf, can handle
embedded images
=head1 AUTHOR
kevin mulholland, moodfarm@cpan.org
=cut
use v5.10;
use strict;
use warnings;
use Data::Printer;
use POSIX qw(strftime);
use Try::Tiny;
use Path::Tiny;
use App::Basis;
use App::Basis::Config;
use App::Basis::ConvertText2;
# -----------------------------------------------------------------------------
my $MARKUP_DIR = "$ENV{HOME}/." . get_program();
$MARKUP_DIR = $ENV{MARKUP_DIR} if ( $ENV{MARKUP_DIR} );
my $CACHE_DIR = "/tmp/" . getpwuid($>) . "/cache";
my $TEMPLATE = <<EOD;
<!DOCTYPE html>
<html>
<head>
<title>%TITLE%</title>
<meta name="Created" content="%DATE%" />
<meta name="Author" content="%AUTHOR%" />
<meta name="Copyright" content="%COPYRIGHT%" />
<meta name="summary" content="%SUMMARY%" />
<meta name="keywords" content="%KEYWORDS%" />
<meta name="revision" content="%REVISION%" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style type='text/css'>
\@page {
size: %PAGE_SIZE% %ORIENTATION% ;
margin: 90pt 30pt 40pt 30pt ;
\@top {
margin: -10pt 0pt 0pt -90pt ;
}
\@bottom-right { content: counter(page) ;}
} }
body {font-style: sans-serif;}
/* toc */
#toc {
padding: 0.4em;
page-break-after: always;
}
#toc p {
font-weight: bold;
font-size: 32;
}
#toc h3 {
text-align: center
}
#toc ul {
columns: 1;
}
#toc ul, #toc li {
list-style: none;
margin: 0;
padding: 0;
padding-left: 10px ;
}
#toc a::after {
content: leader('.') target-counter(attr(href), page);
font-style: normal;
}
#toc a {
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;
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
my %opt = init_app(
help_text => "Convert my modified markdown text files into other formats, by
default will create HTML in same directory as the input file, will only
process .md files.
If there is no output option used the output will be to file of same name
as the input filename but with an extension (if provided) from the
document, use format: keyword (pdf html doc).",
help_cmdline => "filename",
options => {
'verbose|v' => 'verbose mode',
'clean|c' => 'Clean up the cache before use',
'template|s=s' => 'name of template to use',
'embed|e' => 'Embed images into HTML, do not use this if converting to doc/odt',
'prince|p' => 'Convert to PDF using princexml, can handle embedded images',
'wkhtmltopdf|w' => 'Convert to PDF using wkhtmltopdf, can handle embedded images',
'output|o=s' => {
desc => 'Filename to store the output as, extension will control conversion',
default => "",
}
}
);
set_debug( \&other_debug ) if ( $opt{verbose} );
show_usage( "You cannot use both prince and wkhtmltopdf options") if( $opt{prince} && $opt{wkhtmltopdf}) ;
$opt{config_dir} ||= $MARKUP_DIR;
( run in 0.704 second using v1.01-cache-2.11-cpan-df04353d9ac )