/usr/share/perl5/Biber/UCollate.pm is in biber 2.9-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | package Biber::UCollate;
use v5.24;
use strict;
use Carp;
use Data::Dump;
use parent qw(Unicode::Collate::Locale);
my $logger = Log::Log4perl::get_logger('main');
=encoding utf-8
=head1 NAME
Biber::UCollate
=head2 new
Instantiate new Unicode::Collate::Locale object with some extra reporting checks.
We need this also so that we can chain some things during sorting object construction.
Without an object, we would need to call a regular subroutine but due to the special
semantics of Schwartzian transforms, we need to chain all sorting elements so that they return
a boolean value (see Biber.pm). This is much tidier with Foo->new()->change()->cmp than
with something messy like "my $uc = create_uc_object; $uc->change()->cmp()" etc.
=cut
sub new {
my $class = shift;
my ($thislocale, %collopts) = @_;
# Add tailoring locale for Unicode::Collate
# Ignore table as this is not valid for U::C::Locale objects
if ($thislocale and not $collopts{locale}) {
$collopts{locale} = $thislocale;
if ($collopts{table}) {
my $t = delete $collopts{table};
$logger->info("Ignoring collation table '$t' as locale is set ($thislocale)");
}
}
# Remove locale from options as we need this to make the object
my $coll_locale = delete $collopts{locale};
# Now create the collator object
my $Collator = $class->SUPER::new(locale => $coll_locale)
or $logger->logcarp("Problem creating Unicode::Collate::Locale object: $@");
# Fix the old "alternate" alias otherwise we have problems as U::C->change() always
# returns the new "variable" option and we get confused.
if (my $alt = delete $collopts{alternate}) {
$collopts{variable} = $alt;
}
# Show the collation options when debugging
if ($logger->is_debug()) {# performance tune
$logger->debug('Collation options: ' . Data::Dump::pp(%collopts));
}
# Tailor the collation object and report differences from defaults for locale
# Have to do this in ->change method as ->new can croak with conflicting tailoring
# for locales which enforce certain tailorings
my %coll_changed = $Collator->change( %collopts );
while (my ($k, $v) = each %coll_changed) {
# If we are changing something that has no override tailoring in the locale, it
# is undef in this hash and we don't care about such things
next unless defined($coll_changed{$k});
if ($coll_changed{$k} ne $collopts{$k}) {
$logger->info("Overriding locale '$coll_locale' defaults '$k = $v' with '$k = " . $collopts{$k} . "'");
}
}
return $Collator;
}
1;
__END__
=head1 AUTHORS
François Charette, C<< <firmicus at ankabut.net> >>
Philip Kime C<< <philip at kime.org.uk> >>
=head1 BUGS
Please report any bugs or feature requests on our Github tracker at
L<https://github.com/plk/biber/issues>.
=head1 COPYRIGHT & LICENSE
Copyright 2009-2017 François Charette and Philip Kime, all rights reserved.
This module is free software. You can redistribute it and/or
modify it under the terms of the Artistic License 2.0.
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.
=cut
|