Sort an outline at every level: Difference between revisions

Content added Content deleted
(Added AutoHotkey)
No edit summary
Line 1,029: Line 1,029:
Trying to parse another bad outline:
Trying to parse another bad outline:
Error: bad indent UInt8[0x20, 0x20, 0x20], expected UInt8[0x20, 0x20, 0x20, 0x20]
Error: bad indent UInt8[0x20, 0x20, 0x20], expected UInt8[0x20, 0x20, 0x20, 0x20]
</pre>

=={{header|Perl}}==
<lang perl>#!/usr/bin/perl

use strict; # https://rosettacode.org/wiki/Sort_an_outline_at_every_level
use warnings;

for my $test ( split /^(?=#)/m, join '', <DATA> )
{
my ( $id, $outline ) = $test =~ /(\V*?\n)(.*)/s;
my $sorted = validateandsort( $outline, $id =~ /descend/ );
print $test, '=' x 20, " answer:\n$sorted\n";
}

sub validateandsort
{
my ($outline, $descend) = @_;
$outline =~ /^\h*(?: \t|\t )/m and
return "ERROR: mixed tab and space indentaion\n";
my $adjust = 0;
$adjust++ while $outline =~ s/^(\h*)\H.*\n\1\K\h(?=\H)//m
or $outline =~ s/^(\h*)(\h)\H.*\n\1\K(?=\H)/$2/m;
$adjust and print "WARNING: adjusting indentation on some lines\n";
return levelsort($outline, $descend);
}

sub levelsort # outline_section, descend_flag
{
my ($section, $descend) = @_;
my @parts;
while( $section =~ / ((\h*) .*\n) ( (?:\2\h.*\n)* )/gx )
{
my ($head, $rest) = ($1, $3);
push @parts, $head . ( $rest and levelsort($rest, $descend) );
}
join '', $descend ? reverse sort @parts : sort @parts;
}

__DATA__
# 4 space ascending
zeta
beta
gamma
lambda
kappa
mu
delta
alpha
theta
iota
epsilon
# 4 space descending
zeta
beta
gamma
lambda
kappa
mu
delta
alpha
theta
iota
epsilon

# mixed tab and space
alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu
# off alignment
zeta
beta
gamma
lambda
kappa
mu
delta
alpha
theta
iota
epsilon</lang>
{{out}}
<pre>
# 4 space ascending
zeta
beta
gamma
lambda
kappa
mu
delta
alpha
theta
iota
epsilon
==================== answer:
alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu

# 4 space descending
zeta
beta
gamma
lambda
kappa
mu
delta
alpha
theta
iota
epsilon

==================== answer:
zeta
gamma
mu
lambda
kappa
delta
beta
alpha
theta
iota
epsilon


# mixed tab and space
alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu
==================== answer:
ERROR: mixed tab and space indentaion

WARNING: adjusting indentation on some lines
# off alignment
zeta
beta
gamma
lambda
kappa
mu
delta
alpha
theta
iota
epsilon
==================== answer:
alpha
epsilon
iota
theta
zeta
beta
delta
gamma
kappa
lambda
mu
</pre>
</pre>