Sort an outline at every level: Difference between revisions
Content added Content deleted
Alpha bravo (talk | contribs) (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> |
||