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";