aboutsummaryrefslogtreecommitdiff
path: root/bin/biblatex-tidy
diff options
context:
space:
mode:
Diffstat (limited to 'bin/biblatex-tidy')
-rwxr-xr-xbin/biblatex-tidy103
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;