lsg

Lumidify Site Generator
git clone git://lumidify.org/lsg.git (fast, but not encrypted)
git clone https://lumidify.org/git/lsg.git (encrypted, but very slow)
Log | Files | Refs | README | LICENSE

commit 07da68d9e0b5a2bb62bf7540dfecfc7df5ee7117
parent 0c7c2a7e4984ac072327b52ec90efd2330232d46
Author: lumidify <nobody@lumidify.org>
Date:   Fri,  6 Oct 2023 18:32:41 +0200

Improve book sorting

Diffstat:
MLSG/UserFuncs.pm | 22+++++++++++++++++++++-
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";