commit 07da68d9e0b5a2bb62bf7540dfecfc7df5ee7117
parent 0c7c2a7e4984ac072327b52ec90efd2330232d46
Author: lumidify <nobody@lumidify.org>
Date: Fri, 6 Oct 2023 18:32:41 +0200
Improve book sorting
Diffstat:
1 file changed, 21 insertions(+), 1 deletion(-)
diff --git a/LSG/UserFuncs.pm b/LSG/UserFuncs.pm
@@ -31,6 +31,26 @@ use LSG::Misc;
# 2: page language
# 3-: other args (e.g. for func call)
+# Yeah, this is extremely inefficient, but it's
+# not like we're comparing billions of books.
+sub sort_numeric {
+ my ($a, $b) = @_;
+ my @s1 = split(/(\d+)/, $a);
+ my @s2 = split(/(\d+)/, $b);
+ for my $i (0..$#s1) {
+ if ($i > $#s2) {
+ return 1;
+ }
+ if ($s1[$i] ne $s2[$i]) {
+ return ($s1[$i] =~ /\d+/ && $s2[$i] =~ /\d+/) ? $s1[$i] <=> $s2[$i] : $s1[$i] cmp $s2[$i];
+ }
+ }
+ if ($#s2 > $#s1) {
+ return -1;
+ }
+ return 0;
+}
+
sub sort_books {
my $pageid = shift;
my $lang = shift;
@@ -49,7 +69,7 @@ sub sort_books {
}
my $current = "";
foreach my $id (sort {$tmp_md{$a}->{$lang}->{$sort_by} cmp $tmp_md{$b}->{$lang}->{$sort_by} or
- $tmp_md{$a}->{$lang}->{"title"} cmp $tmp_md{$b}->{$lang}->{"title"}} (keys %tmp_md)) {
+ sort_numeric($tmp_md{$a}->{$lang}->{"title"}, $tmp_md{$b}->{$lang}->{"title"})} (keys %tmp_md)) {
if ($create_subheadings && $create_subheadings eq "true" && $current ne $tmp_md{$id}->{$lang}->{$sort_by}) {
$current = $tmp_md{$id}->{$lang}->{$sort_by};
$output .= "<h3>$current</h3>\n";