Prty

 view release on metacpan or  search on metacpan

lib/Prty/String.pm  view on Meta::CPAN


    my $ind = ' ' x 4; # Einrückung
                      ^ ^
                      hier müssen Leerzeichen (oder Tabs) stehen
    
    my $ind = ' ' x 4;# Einrückung
                      ^
                      Wird nicht erkannt!
    
    my $ind = ' ' x 4; #Einrückung
                       ^
                       Wird nicht erkannt!

Im Falle von mehrzeiligen Kommentaren ($start und $stop sind
definiert) ist dies das vorausgehende Leereichen nicht nötig.

=head4 Examples

HTML, XML:

    $code = Prty::String->removeComments($code,'<!--','-->');

C, Java, CSS:

    $code = Prty::String->removeComments($code,'/*','*/');

C++, JavaScript:

    $code = Prty::String->removeComments($code,'//');

Shell, Perl, Python, Ruby, ...:

    $code = Prty::String->removeComments($code,'#');

SQL:

    $code = Prty::String->removeComments($code,'--');

=cut

# -----------------------------------------------------------------------------

sub removeComments {
    my ($this,$code,$start,$stop) = @_;

    my $regex;
    if ($start && $stop) {
        # (potentiell) mehrzeiliger Kommentar
        $regex = qr/\Q$start\E.*?\Q$stop\E/s;
    }
    else {
        # einzeilger Kommentar
        $regex = qr/(?:^|(?<=[\t ]))\Q$start\E .*/m;
    }
    
    # Spaces u. Tabs an Zeilenenden entfernen
    $code =~ s|[\t ]+$||mg;

    # Entferne alle Kommentare aus dem Quelltext und speichere die
    # übrigbleibenden Fragmente in einem Array
    my @frag = split m|$regex|s,$code;
    
    if (@frag) {
        if ($frag[-1] =~ /^$/) {
            # End-Kommentar, da das letzte Element "leer" ist. Ein
            # End-Kommentar zeichnet sich dadurch aus, dass wir
            # Leerzeilen ggf. *davor* entfernen müssen. Vorgehen:
            # 1) Wir entfernen das letzte Element
            # 2) Wir entfernen Whitspace am Ende des vorhergehenden
            #    Elements, bis auf ein Newline, falls vorhanden
            pop @frag;
            $frag[-1] =~ s/\s+$/substr($&,0,1) eq "\n"? "\n": ''/e;
        }

        for (my $i = 0; $i < @frag-1; $i++) {
            # Wir entfernen alle Spaces und Tabs, die vor dem Kommentar stehen
            $frag[$i] =~ s/([\t ]+)$//;

            if ($frag[$i] eq '' || substr($frag[$i],-1,1) eq "\n") {
                # Ganzzeiliger Kommentar
    
                # Einrückung des (ganzzeiligen) Kommentars vom linken Rand
                my $ind = $1;

                my ($prevInd,$prevContent) = $frag[$i] =~ /([\t ]*)(.*)$/;
                if ($ind && $prevContent && $ind eq $prevInd) {
                    # Die vorhergehende Zeile ist keine Leerzeile (sie hat
                    # Content) und ist identisch eingerückt wie der Kommentar:
                    # Wir entfernen nur den Zeilenumbruch der Zeile.
                    $frag[$i+1] =~ s/^\n//;
                }
                else {
                    # Die vorhergehende Zeile ist eine Leerzeile oder
                    # hat anders eingerückten Content: Wir entfernen den
                    # Zeilenumbruch der Zeile und alle folgenden Leerzeilen.
                    $frag[$i+1] =~ s/^\n+//;
                }
            }
            else {
                # Teilzeiliger Kommentar: nichts zu tun, da der Kommentar
                # und der Leerraum davor bereits entfernt ist
            }
        }
    }

    return join('',@frag);
}

# -----------------------------------------------------------------------------

=head2 Umbruch

=head3 wrap() - Umbreche Fließtext

=head4 Synopsis

    $text = $class->wrap($text,@opt);

=head4 Options

=over 4



( run in 0.721 second using v1.01-cache-2.11-cpan-71847e10f99 )