URI: 
       tImprove book sorting - lsg - Lumidify Site Generator
  HTML git clone git://lumidify.org/lsg.git (fast, but not encrypted)
  HTML git clone https://lumidify.org/git/lsg.git (encrypted, but very slow)
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 07da68d9e0b5a2bb62bf7540dfecfc7df5ee7117
   DIR parent 0c7c2a7e4984ac072327b52ec90efd2330232d46
  HTML Author: lumidify <nobody@lumidify.org>
       Date:   Fri,  6 Oct 2023 18:32:41 +0200
       
       Improve book sorting
       
       Diffstat:
         M LSG/UserFuncs.pm                    |      22 +++++++++++++++++++++-
       
       1 file changed, 21 insertions(+), 1 deletion(-)
       ---
   DIR diff --git a/LSG/UserFuncs.pm b/LSG/UserFuncs.pm
       t@@ -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;
       t@@ -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";