# ABSTRACT: Perl Markdown Compiler
package Markdown::Compiler;
use Moo;
use Markdown::Compiler::Lexer;
use Markdown::Compiler::Parser;
use Markdown::Compiler::Target::HTML;
use Module::Runtime qw( use_module );
has source => (
is => 'ro',
required => 1,
);
has lexer => (
is => 'ro',
lazy => 1,
builder => sub {
Markdown::Compiler::Lexer->new( source => shift->source );
},
);
has parser => (
is => 'ro',
lazy => 1,
builder => sub {
Markdown::Compiler::Parser->new( stream => shift->stream );
},
);
has stream => (
is => 'ro',
lazy => 1,
builder => sub {
shift->lexer->tokens;
},
);
has tree => (
is => 'ro',
lazy => 1,
builder => sub {
shift->parser->tree;
},
);
has compiler => (
is => 'ro',
lazy => 1,
builder => sub {
Markdown::Compiler::Target::HTML->new( tree => shift->tree );
},
);
sub compiler_for {
my ( $self, $target ) = @_;
$target = substr($target,0,1) eq '+'
? substr($target,1)
: 'Markdown::Compiler::Target::' . $target;
return use_module("$target")->new( tree => $self->tree );
}
has result => (
is => 'ro',
lazy => 1,
builder => sub {
shift->compiler->result;
}
);
has metadata => (
is => 'ro',
lazy => 1,
builder => sub {
shift->compiler->metadata;
}
);
1;
__END__
=encoding utf8
=head1 NAME
Markdown::Compiler - A Markdown Compiler
=head1 DESCRIPTION
Markdown::Compiler makes it easy to customize the rendering of a Markdown document.
Markdown::Compiler parses Markdown documents with a hand-rolled lexer and parser. A compiler then turns the parse tree into the target document.
The stream of tokens from the lexer and the parse tree itself as easily dumped.
=head1 SYNOPSIS
=head1 CONSTRUCTOR
=head2 source
=head2 lexer
=head2 parser
=head2 compiler
=head1 METHODS
=head2 lexer
=head2 parser
=head2 stream
=head2 tree
=head2 compiler
=head2 result
=head2 metadata
=head1 AUTHOR
Kaitlyn Parkhurst (SymKat) I<E<lt>symkat@symkat.comE<gt>> ( Blog: L<http://symkat.com/> )
=head1 CONTRIBUTORS
=head1 COPYRIGHT
Copyright (c) 2021 the Markdown::Compiler L</AUTHOR> and L</CONTRIBUTORS> as listed above.
=head1 LICENSE
This library is free software and may be distributed under the same terms as perl itself.
=head1 AVAILABILITY
The most current version of Markdown::Compiler can be found at L<https://github.com/symkat/Markdown-Compiler>