-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Asciidoctor module and refactor command utils
Remove the preference for `asciidoctor` from Text::Markup::Asciidoc and put it in a new parser, Text::Markup::Asciidoctor. Like Text::Markup::CommonMark, this module is not auto-loaded by Text::Markup when it recognizes an AsciiDoc document; it still defaults to Text::Markup::Asciidoc for backward compatibility. But when the user uses the module, it will be used in preference to Text::Markup::Asciidoc. This makes three parsers that use external command line utilities, so extract the functions used to find and execute those utilities into a new module, Text::Markup::Cmd. This reduces a ton of duplicate code and simplifies adding new CLI-oriented parsers in the future. It also simplifies the testing, as there is no longer magic behavior in the Asciidoc and Markdown modules, so each can be tested individually.
- Loading branch information
Showing
10 changed files
with
326 additions
and
197 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
package Text::Markup::Asciidoctor; | ||
|
||
use 5.8.1; | ||
use strict; | ||
use warnings; | ||
use Text::Markup::Cmd; | ||
use utf8; | ||
|
||
our $VERSION = '0.30'; | ||
|
||
# Replace Text::Markup::Asciidoc. | ||
Text::Markup->register( asciidoc => qr{a(?:sc(?:iidoc)?|doc)?} ); | ||
|
||
# Find Asciidoc. | ||
my $ASCIIDOC = find_cmd([ | ||
(map { (WIN32 ? ("$_.exe", "$_.bat") : ($_)) } qw(asciidoctor)), | ||
'asciidoctor.py', | ||
], '--version'); | ||
|
||
# Arguments to pass to asciidoc. | ||
# Restore --safe if Asciidoc ever fixes it with the XHTML back end. | ||
# https://groups.google.com/forum/#!topic/asciidoc/yEr5PqHm4-o | ||
my @OPTIONS = qw( | ||
--no-header-footer | ||
--out-file - | ||
--attribute newline=\\n | ||
); | ||
|
||
sub parser { | ||
my ($file, $encoding, $opts) = @_; | ||
my $html = do { | ||
my $fh = open_pipe( | ||
$ASCIIDOC, @OPTIONS, | ||
'--attribute' => "encoding=$encoding", | ||
$file | ||
); | ||
|
||
binmode $fh, ":encoding($encoding)"; | ||
local $/; | ||
<$fh>; | ||
}; | ||
|
||
# Make sure we have something. | ||
return unless $html =~ /\S/; | ||
utf8::encode $html; | ||
return $html if $opts->{raw}; | ||
return qq{<html> | ||
<head> | ||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | ||
</head> | ||
<body> | ||
$html | ||
</body> | ||
</html> | ||
}; | ||
} | ||
1; | ||
__END__ | ||
=head1 Name | ||
Text::Markup::Asciidoc - Asciidoc parser for Text::Markup | ||
=head1 Synopsis | ||
use Text::Markup::Asciidoctor; | ||
my $html = Text::Markup->new->parse(file => 'hello.adoc'); | ||
my $raw_asciidoc = Text::Markup->new->parse(file => 'hello.adoc', raw => 1 ); | ||
=head1 Description | ||
This is the L<Asciidoc|https://asciidoc.org/> parser for L<Text::Markup>. It | ||
depends on the C<asciidoctor> command-line application; see the | ||
L<installation docs|https://asciidoctor.org/#installation> for details, or | ||
use the command C<gem install asciidoctor>. Note that L<Text::Markup> does | ||
not load this module by default, but when loaded manually will replace | ||
Text::Markup::Asciidoc as preferred Asciidoc parser. | ||
Text::Markup::Asciidoctor reads in the file (relying on a | ||
L<BOM|https://www.unicode.org/unicode/faq/utf_bom.html#BOM>), hands it off to | ||
L<C<asciidoctor>|https://asciidoctor.org> for parsing, and then returns the | ||
generated HTML as an encoded UTF-8 string with an C<http-equiv="Content-Type"> | ||
element identifying the encoding as UTF-8. | ||
Text::Markup::Asciidoctor recognizes files with the following extensions as | ||
Asciidoc: | ||
=over | ||
=item F<.asciidoc> | ||
=item F<.asc> | ||
=item F<.adoc> | ||
=back | ||
Normally this parser returns the output of C<asciidoctor> wrapped in a minimal | ||
HTML page skeleton. If you would prefer to just get the exact output returned | ||
by C<asciidoctor>, you can pass in a true value for the C<raw> option. | ||
=head1 Author | ||
David E. Wheeler <david@justatheory.com> | ||
=head1 Copyright and License | ||
Copyright (c) 2012-2023 David E. Wheeler. Some Rights Reserved. | ||
This module is free software; you can redistribute it and/or modify it under | ||
the same terms as Perl itself. | ||
=cut |
Oops, something went wrong.