#!/usr/bin/perl -w use strict; use Test; BEGIN { plan tests => 18; } # Collapses sequences of Re: together into one Re(\d): sub re_collapse { my $title = shift; # Normal 'Re: Re: ' sequences $title =~ s{(Re: ){2,}}{"Re(" . length($&)/4 . "): "}ge; # Already renumbered: # 'Re: Re(\d+): ' while($title =~ s{Re: Re\((\d+)\): }{"Re(" . ($1 + 1) . "): " }ge){}; # 'Re(\d+): Re: ' while($title =~ s{Re\((\d+)\): Re: }{"Re(" . ($1 + 1) . "): " }ge){}; # 'Re(\d+): Re(\d+): ' while($title =~ s{Re\((\d)\): Re\((\d)\): }{"Re(" . ($1 + $2) . "): "}ge){}; return $title; } # Adds a new Re: or Re(\d): at the start of a string: sub re_add { my $title = shift; $title =~ s{^(Re(\((\d+)\))?: )?}{($1) ? ("Re(" . (($3||1) + 1) . "): ") : "Re: "}e; return $title; } ########################### # # Tests: # # Testing re_collapse: # Should not change: ok(&re_collapse("(DaP) Re: Foo is not Bar") eq "(DaP) Re: Foo is not Bar"); ok(&re_collapse("(DaP) Foo is not Bar") eq "(DaP) Foo is not Bar"); ok(&re_collapse("Re(3): (DaP) Re: Foo is not Bar") eq "Re(3): (DaP) Re: Foo is not Bar"); # Normal Re: sequences: ok(&re_collapse("Re: Re: Foo is not Bar") eq "Re(2): Foo is not Bar"); ok(&re_collapse("Re: Re: Re: Foo is not Bar") eq "Re(3): Foo is not Bar"); ok(&re_collapse("Re: Re: (DaP) Re: Foo is not Bar") eq "Re(2): (DaP) Re: Foo is not Bar"); ok(&re_collapse("Re: Re: (DaP) Re: Re: Foo is not Bar") eq "Re(2): (DaP) Re(2): Foo is not Bar"); # Already renumbered: ok(&re_collapse("Re: Re(2): Foo is not Bar") eq "Re(3): Foo is not Bar"); ok(&re_collapse("Re(2): Re: Foo is not Bar") eq "Re(3): Foo is not Bar"); ok(&re_collapse("Re: Re(2): (DaP) Re: Re(2): Foo is not Bar") eq "Re(3): (DaP) Re(3): Foo is not Bar"); ok(&re_collapse("Re(2): Re: Re: Re(2): Foo is not Bar") eq "Re(6): Foo is not Bar"); ok(&re_collapse("Re: Re(2): (DaP) Re(2): Re: Foo is not Bar") eq "Re(3): (DaP) Re(3): Foo is not Bar"); ok(&re_collapse("Re: Re: Re(2): (DaP) Re(2): Re: Re(4): Re: Foo is not Bar") eq "Re(4): (DaP) Re(8): Foo is not Bar"); # Example from node id 168373: # (Nothing much to do about such). ok(&re_collapse("Re: Re: (Someone) Re: (Someoneelse) Re: (Someotherelse) Re: Re: Something") eq "Re(2): (Someone) Re: (Someoneelse) Re: (Someotherelse) Re(2): Something"); ####################### # Testing re_add: ok(&re_add("Foo is not Bar") eq "Re: Foo is not Bar"); ok(&re_add("Re: Foo is not Bar") eq "Re(2): Foo is not Bar"); ok(&re_add("Re(2): Foo is not Bar") eq "Re(3): Foo is not Bar"); # This one has to be collapsed later, so this is ok: ok(&re_add("Re: Re: Foo is not Bar") eq "Re(2): Re: Foo is not Bar"); #######################