diff options
Diffstat (limited to 'bin/biblatex-tidy')
-rwxr-xr-x | bin/biblatex-tidy | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/bin/biblatex-tidy b/bin/biblatex-tidy new file mode 100755 index 0000000..39ed4f4 --- /dev/null +++ b/bin/biblatex-tidy @@ -0,0 +1,103 @@ +#!/usr/bin/perl + +# tidy BibLaTeX file + +# Depends: bibclean libpath-tiny-perl + +use v5.36; +use strict; + +use IPC::Run3 qw/run3/; + +=head1 NAME + +biblatex-tidy - tidy BibLaTeX data + +=head1 VERSION + +Version 0.0.1 + +=head1 SYNOPSIS + + biblatex-tidy INFILE + + biblatex-tidy INFILE OUTFILE + + biblatex-tidy < INFILE > OUTFILE + +=head1 DESCRIPTION + +B<biblatex-tidy> reformats BibLaTeX data. + +If a only a single filename is given, +the file contents are replaced. + +If two filenames are given, +the first is read and cleaned output is saved the the second. + +If no filenames are given, +then data is expected on STDIN +and cleaned data is emitted on STDOUT. + +Internally, +the tool B<bibclean> is called internally to do the actual tidying. +If data contains a line beginning with C<@Comment{jabref-meta:>, +typically added by JabRef at the end of BibLaTeX data, +then the remaining data is I<not> cleaned, +because B<bibclean> fails to parse such comments. +=cut + +# slurp INFILE if passed as first argument, or else STDIN +my ( $infile, $outfile, $bogus ) = @ARGV; +die 'Too many arguments: expected INFILE and OUTFILE' if $bogus; +@ARGV = ($infile) if $infile; +my $content = do { local $/ = undef; <> }; + +# put aside eventual trailing JabRef comments to not confuse bibclean +my ( $data, $comments ) = split /(?=\n\@Comment\{jabref-meta:)/, $content, 2; + +# call bibclean on comment-stripped data +my @command = qw(bibclean -max-width 0); +my $newdata; +run3( \@command, \$data, \$newdata, + { binmode_stdin => ':utf8', binmode_stdout => ':utf8' } ) + or die "Failed to execute @command: $?"; + +# save/replace/spew cleaned data, reviving eventual trailing comments +if ($infile) { + open( FH, '>', $outfile || $infile ) or die $!; + print FH $newdata, $comments; +} +else { + print $newdata, $comments; +} + +=encoding UTF-8 + +=head1 AUTHOR + +Jonas Smedegaard C<< <dr@jones.dk> >> + +=head1 COPYRIGHT AND LICENSE + + Copyright © 2024 Jonas Smedegaard + +This program is free software: +you can redistribute it and/or modify it +under the terms of the GNU Affero General Public License +as published by the Free Software Foundation, +either version 3, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; +without even the implied warranty +of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +See the GNU Affero General Public License for more details. + +You should have received a copy +of the GNU Affero General Public License along with this program. +If not, see <https://www.gnu.org/licenses/>. + +=cut + +1; |