FAQ
Hello,

I'm having a lot of trouble figuring out how to remove blank lines
from my HTML. The lines are generated by my shopping cart. I use
(and highly recommend) interchange:

http://www.icdevgroup.org

I basically want to wrap all of my code in [filter
no_blank_lines][/filter]. no_blank_lines is defined this way:

CodeDef no_blank_lines Routine <<EOR
sub {
my $val = shift;
#$val =~ s/\s+//g;
#$val =~ s/\s*\n+\s*/\n/g;
#$val =~ s/[^\S\n]*\n\s*\n/\n/g;
$val =~ s/\n\n+/\n/g;
return $val;
}
EOR

Those are all regexp's I've tried. They all seem to do nothing except
the first one removes all whitespace including the spaces in between
characters in my code which obviously breaks everything. Can anyone
suggest a solution?

Search Discussions

  • Beginner at Mar 12, 2007 at 6:16 pm

    On 12 Mar 2007 at 11:09, Grant wrote:

    Hello,

    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR
    This is untested but usually works for me

    $val =~ s/^$//g

    not sure you'll need the gobal switch if you'r reading line by line
    but it can't hurt.
    Those are all regexp's I've tried. They all seem to do nothing except
    the first one removes all whitespace including the spaces in between
    characters in my code which obviously breaks everything. Can anyone
    suggest a solution?
    HTH,
    Dp.
  • Wagner, David --- Senior Programmer Analyst --- WGO at Mar 12, 2007 at 6:32 pm

    -----Original Message-----
    From: Beginner
    Sent: Monday, March 12, 2007 11:16
    To: beginners@perl.org
    Subject: Re: Removing blank lines
    On 12 Mar 2007 at 11:09, Grant wrote:

    Hello,

    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR
    This is untested but usually works for me

    $val =~ s/^$//g
    I would chg ^$ to ^\s*$ which says if you by chance only
    whitespace between the start and end of line, consider a blank line. The
    works, but any whitespace will leave what appears to the eye as a blank
    line.

    A thought.

    Wags ;)
    David R Wagner
    Senior Programmer Analyst
    FedEx Freight
    1.408.323.4225x2224 TEL
    1.408.323.4449 FAX
    http://fedex.com/us
    not sure you'll need the gobal switch if you'r reading line by line
    but it can't hurt.
    Those are all regexp's I've tried. They all seem to do
    nothing except
    the first one removes all whitespace including the spaces in between
    characters in my code which obviously breaks everything. Can anyone
    suggest a solution?
    HTH,
    Dp.



    --
    To unsubscribe, e-mail: beginners-unsubscribe@perl.org
    For additional commands, e-mail: beginners-help@perl.org
    http://learn.perl.org/

    **********************************************************************
    This message contains information that is confidential and proprietary to FedEx Freight or its affiliates. It is intended only for the recipient named and for the express purpose(s) described therein. Any other use is prohibited.
    **********************************************************************
  • Grant at Mar 12, 2007 at 6:44 pm

    Hello,

    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR
    This is untested but usually works for me

    $val =~ s/^$//g
    I would chg ^$ to ^\s*$ which says if you by chance only
    whitespace between the start and end of line, consider a blank line. The
    works, but any whitespace will leave what appears to the eye as a blank
    line.
    Neither of these remove any of the blank lines in my HTML actually.

    - Grant
  • Rob Dixon at Mar 12, 2007 at 6:44 pm

    Wagner, David --- Senior Programmer Analyst --- WGO wrote:
    -----Original Message-----
    From: Beginner
    Sent: Monday, March 12, 2007 11:16
    To: beginners@perl.org
    Subject: Re: Removing blank lines
    On 12 Mar 2007 at 11:09, Grant wrote:

    Hello,

    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR
    This is untested but usually works for me

    $val =~ s/^$//g
    I would chg ^$ to ^\s*$ which says if you by chance only
    whitespace between the start and end of line, consider a blank line. The
    works, but any whitespace will leave what appears to the eye as a blank
    line.
    Neither of these will do what is required, as the $ will match before the
    newline at the end of the string and nothing will be removed. (In David's
    modification, just the whitespace in the line will be deleted and not the
    line terminator.)

    Rob
  • Rob Dixon at Mar 12, 2007 at 6:38 pm

    Grant wrote:
    Hello,

    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR

    Those are all regexp's I've tried. They all seem to do nothing except
    the first one removes all whitespace including the spaces in between
    characters in my code which obviously breaks everything. Can anyone
    suggest a solution?
    $val =~ s/^\s*\n//mg;

    Rob
  • Grant at Mar 12, 2007 at 6:47 pm

    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR

    Those are all regexp's I've tried. They all seem to do nothing except
    the first one removes all whitespace including the spaces in between
    characters in my code which obviously breaks everything. Can anyone
    suggest a solution?
    $val =~ s/^\s*\n//mg;
    I'm not having any luck there either. I'm not sure what is actually
    creating the blank lines. It could be spaces, tabs, or some other
    blank line creator.

    - Grant
  • Rob Dixon at Mar 12, 2007 at 7:19 pm

    Grant wrote:
    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR

    Those are all regexp's I've tried. They all seem to do nothing except
    the first one removes all whitespace including the spaces in between
    characters in my code which obviously breaks everything. Can anyone
    suggest a solution?
    $val =~ s/^\s*\n//mg;
    I'm not having any luck there either. I'm not sure what is actually
    creating the blank lines. It could be spaces, tabs, or some other
    blank line creator.
    The \s marker will match all of those. Can you show us your code please?
    Don't forget that your function is returning the modified text and you have
    to assign it to something - it won't change the contents of the string you
    pass as a parameter written that way.

    Rob
  • Yitzle at Mar 12, 2007 at 7:26 pm
    Have the data in an array and do
    i = 0;
    foreach (@text) { $text2[i++] = $_ if (! m/^\s$/); }
    On 3/12/07, Rob Dixon wrote:
    Grant wrote:
    I'm having a lot of trouble figuring out how to remove blank lines
    from my HTML. The lines are generated by my shopping cart. I use
    (and highly recommend) interchange:

    http://www.icdevgroup.org

    I basically want to wrap all of my code in [filter
    no_blank_lines][/filter]. no_blank_lines is defined this way:

    CodeDef no_blank_lines Routine <<EOR
    sub {
    my $val = shift;
    #$val =~ s/\s+//g;
    #$val =~ s/\s*\n+\s*/\n/g;
    #$val =~ s/[^\S\n]*\n\s*\n/\n/g;
    $val =~ s/\n\n+/\n/g;
    return $val;
    }
    EOR

    Those are all regexp's I've tried. They all seem to do nothing except
    the first one removes all whitespace including the spaces in between
    characters in my code which obviously breaks everything. Can anyone
    suggest a solution?
    $val =~ s/^\s*\n//mg;
    I'm not having any luck there either. I'm not sure what is actually
    creating the blank lines. It could be spaces, tabs, or some other
    blank line creator.
    The \s marker will match all of those. Can you show us your code please?
    Don't forget that your function is returning the modified text and you have
    to assign it to something - it won't change the contents of the string you
    pass as a parameter written that way.

    Rob

    --
    To unsubscribe, e-mail: beginners-unsubscribe@perl.org
    For additional commands, e-mail: beginners-help@perl.org
    http://learn.perl.org/
  • Tom Phoenix at Mar 12, 2007 at 7:36 pm

    On 3/12/07, yitzle wrote:

    Have the data in an array and do
    i = 0;
    foreach (@text) { $text2[i++] = $_ if (! m/^\s$/); }
    If you had remembered to put a dollar sign on $i, you'd be reinventing grep:

    my @text2 = grep ! /^\s$/, @text;

    Cheers!

    --Tom Phoenix
    Stonehenge Perl Training
  • Grant at Mar 12, 2007 at 8:37 pm

    $val =~ s/^\s*\n//mg;
    I'm not having any luck there either. I'm not sure what is actually
    creating the blank lines. It could be spaces, tabs, or some other
    blank line creator.
    The \s marker will match all of those. Can you show us your code please?
    Don't forget that your function is returning the modified text and you have
    to assign it to something - it won't change the contents of the string you
    pass as a parameter written that way.
    In this instance I have two blank lines in the delivered HTML between
    htmltag1 and htmltag2:

    <htmltag1></htmltag1>
    [ictag][/ictag]
    [ictag][/ictag]
    <htmltag2></htmltag2>

    If I use the filter like this:

    <htmltag1></htmltag1>[filter no_white]
    [ictag][/ictag]
    [ictag][/ictag]
    [/filter]<htmltag2></htmltag2>

    I get only one blank line, so it is an improvement. Should it be
    possible to remove the blank lines entirely?

    - Grant
  • Rob Dixon at Mar 13, 2007 at 1:05 pm

    Grant wrote:
    $val =~ s/^\s*\n//mg;
    I'm not having any luck there either. I'm not sure what is actually
    creating the blank lines. It could be spaces, tabs, or some other
    blank line creator.
    The \s marker will match all of those. Can you show us your code please?
    Don't forget that your function is returning the modified text and you
    have
    to assign it to something - it won't change the contents of the string
    you
    pass as a parameter written that way.
    In this instance I have two blank lines in the delivered HTML between
    htmltag1 and htmltag2:

    <htmltag1></htmltag1>
    [ictag][/ictag]
    [ictag][/ictag]
    <htmltag2></htmltag2>

    If I use the filter like this:

    <htmltag1></htmltag1>[filter no_white]
    [ictag][/ictag]
    [ictag][/ictag]
    [/filter]<htmltag2></htmltag2>

    I get only one blank line, so it is an improvement. Should it be
    possible to remove the blank lines entirely?
    I'm afraid I don't understand what it is you're doing. You're using
    technology that I'm unfamiliar with, and all I can talk to you about
    is what I know. The regex I showed you will remove all lines that
    contain just whitespace and will never leave even a single line. If you
    can explain a little more about what you are doing then we may be able
    to help further. Or maybe there is someone else on the list that knows
    what this stuff is?

    Rob
  • Chas Owens at Mar 13, 2007 at 3:21 pm
    On 3/12/07, Grant wrote:
    snip
    In this instance I have two blank lines in the delivered HTML between
    htmltag1 and htmltag2:

    <htmltag1></htmltag1>
    [ictag][/ictag]
    [ictag][/ictag]
    <htmltag2></htmltag2>

    If I use the filter like this:

    <htmltag1></htmltag1>[filter no_white]
    [ictag][/ictag]
    [ictag][/ictag]
    [/filter]<htmltag2></htmltag2>

    I get only one blank line, so it is an improvement. Should it be
    possible to remove the blank lines entirely?
    snip

    I may be crazy, but I see two lines with "[ictag][/ictag]" on them
    between "<htmltag1></htmltag1>" and "<htmltag2></htmltag2>". When
    most people on this list say "blank lines" we mean either a line with
    no characters other than the line-terminator (\n) or a line with
    whitespaces (tabs and spaces) followed by the line-terminator.
  • Grant at Mar 13, 2007 at 3:45 pm

    In this instance I have two blank lines in the delivered HTML between
    htmltag1 and htmltag2:

    <htmltag1></htmltag1>
    [ictag][/ictag]
    [ictag][/ictag]
    <htmltag2></htmltag2>

    If I use the filter like this:

    <htmltag1></htmltag1>[filter no_white]
    [ictag][/ictag]
    [ictag][/ictag]
    [/filter]<htmltag2></htmltag2>

    I get only one blank line, so it is an improvement. Should it be
    possible to remove the blank lines entirely?
    snip

    I may be crazy, but I see two lines with "[ictag][/ictag]" on them
    between "<htmltag1></htmltag1>" and "<htmltag2></htmltag2>". When
    most people on this list say "blank lines" we mean either a line with
    no characters other than the line-terminator (\n) or a line with
    whitespaces (tabs and spaces) followed by the line-terminator.
    I'm sorry, I should have explained myself better. The interchange
    tags (ictags) are parsed before the HTML is delivered. When they are
    parsed, a bunch of blank lines are left where they had been. BUT!
    The apache list pointed out to me that the Interchange::Link module I
    am using as the link between interchange and apache is delivering the
    content like this:

    while( <SOCK> ) {
    push @out, $_;
    }

    and I should be able to filter the blank lines most efficiently that
    way. This is an alternative to the [filter][/filter] method I had
    been working on. Can anyone show me how to regexp the blank lines out
    considering the above code?

    - Grant
  • Tom Phoenix at Mar 13, 2007 at 4:16 pm

    On 3/13/07, Grant wrote:

    while( <SOCK> ) {
    push @out, $_;
    }
    Can anyone show me how to regexp the blank lines out
    considering the above code?
    Do you mean this?

    while (<SOCK>) {
    push @out, $_ unless /^\s*$/;
    }

    Or, what do you really mean by "blank"?

    Hope this helps!

    --Tom Phoenix
    Stonehenge Perl Training
  • Grant at Mar 13, 2007 at 4:55 pm

    while( <SOCK> ) {
    push @out, $_;
    }
    Can anyone show me how to regexp the blank lines out
    considering the above code?
    Do you mean this?

    while (<SOCK>) {
    push @out, $_ unless /^\s*$/;
    }

    Or, what do you really mean by "blank"?

    Hope this helps!
    Help? Well, it completely fixed the problem. :) Thank you very much
    everyone. I will submit this to the interchange list for official
    inclusion in Interchange:Link.

    - Grant
  • Rob Dixon at Mar 13, 2007 at 5:11 pm

    Grant wrote:
    In this instance I have two blank lines in the delivered HTML between
    htmltag1 and htmltag2:

    <htmltag1></htmltag1>
    [ictag][/ictag]
    [ictag][/ictag]
    <htmltag2></htmltag2>

    If I use the filter like this:

    <htmltag1></htmltag1>[filter no_white]
    [ictag][/ictag]
    [ictag][/ictag]
    [/filter]<htmltag2></htmltag2>

    I get only one blank line, so it is an improvement. Should it be
    possible to remove the blank lines entirely?
    snip

    I may be crazy, but I see two lines with "[ictag][/ictag]" on them
    between "<htmltag1></htmltag1>" and "<htmltag2></htmltag2>". When
    most people on this list say "blank lines" we mean either a line with
    no characters other than the line-terminator (\n) or a line with
    whitespaces (tabs and spaces) followed by the line-terminator.
    I'm sorry, I should have explained myself better. The interchange
    tags (ictags) are parsed before the HTML is delivered. When they are
    parsed, a bunch of blank lines are left where they had been. BUT!
    The apache list pointed out to me that the Interchange::Link module I
    am using as the link between interchange and apache is delivering the
    content like this:

    while( <SOCK> ) {
    push @out, $_;
    }

    and I should be able to filter the blank lines most efficiently that
    way. This is an alternative to the [filter][/filter] method I had
    been working on. Can anyone show me how to regexp the blank lines out
    considering the above code?
    while( <SOCK> ) {
    push @out, $_ if /\S/;
    }

    Rob
  • Grant at Mar 13, 2007 at 5:14 pm

    In this instance I have two blank lines in the delivered HTML between
    htmltag1 and htmltag2:

    <htmltag1></htmltag1>
    [ictag][/ictag]
    [ictag][/ictag]
    <htmltag2></htmltag2>

    If I use the filter like this:

    <htmltag1></htmltag1>[filter no_white]
    [ictag][/ictag]
    [ictag][/ictag]
    [/filter]<htmltag2></htmltag2>

    I get only one blank line, so it is an improvement. Should it be
    possible to remove the blank lines entirely?
    snip

    I may be crazy, but I see two lines with "[ictag][/ictag]" on them
    between "<htmltag1></htmltag1>" and "<htmltag2></htmltag2>". When
    most people on this list say "blank lines" we mean either a line with
    no characters other than the line-terminator (\n) or a line with
    whitespaces (tabs and spaces) followed by the line-terminator.
    I'm sorry, I should have explained myself better. The interchange
    tags (ictags) are parsed before the HTML is delivered. When they are
    parsed, a bunch of blank lines are left where they had been. BUT!
    The apache list pointed out to me that the Interchange::Link module I
    am using as the link between interchange and apache is delivering the
    content like this:

    while( <SOCK> ) {
    push @out, $_;
    }

    and I should be able to filter the blank lines most efficiently that
    way. This is an alternative to the [filter][/filter] method I had
    been working on. Can anyone show me how to regexp the blank lines out
    considering the above code?
    while( <SOCK> ) {
    push @out, $_ if /\S/;
    }
    Hi Rob,

    Is that better than:

    push @out, $_ unless /^\s*$/;

    - Grant
  • Chas Owens at Mar 13, 2007 at 5:35 pm
    On 3/13/07, Grant wrote:
    snip
    while( <SOCK> ) {
    push @out, $_ if /\S/;
    }
    snip
    Is that better than:

    push @out, $_ unless /^\s*$/;
    snip

    They are functionally equivalent, but (at least on the version of perl
    I have) /\S/ is faster:

    mix:
    Rate /^\s*$/ /\S/
    /^\s*$/ 54.2/s -- -13%
    /\S/ 62.1/s 15% --
    all space:
    Rate /^\s*$/ /\S/
    /^\s*$/ 47.9/s -- -23%
    /\S/ 62.1/s 30% --
    all non-space:
    Rate /^\s*$/ /\S/
    /^\s*$/ 62.7/s -- -1%
    /\S/ 63.6/s 1% --

    #!/usr/bin/perl

    use strict;
    use warnings;
    use Benchmark;

    my @strings;
    my $subs = {
    '/\S/' => sub { my $bool; $bool = /\S/ for @strings },
    '/^\s*$/' => sub { my $bool; $bool = /^\s*$/ for @strings }
    };

    print "mix:\n";
    push @strings, random_string() for 1 .. 10_000;
    Benchmark::cmpthese(-2, $subs);

    print "all space:\n";
    @strings = ();
    push @strings, ' ' x (80 - int rand(80)) for 1 .. 10_000;
    Benchmark::cmpthese(-2, $subs);

    print "all non-space:\n";
    @strings = ();
    push @strings, 'a' x (80 - int rand(80)) for 1 .. 10_000;
    Benchmark::cmpthese(-2, $subs);

    sub random_string {
    if (rand() < .5) {
    return ' ' x (80 - int rand(80));
    } else {
    return 'a' x (80 - int rand(80));
    }
    }
  • Grant at Mar 13, 2007 at 6:23 pm

    while( <SOCK> ) {
    push @out, $_ if /\S/;
    }
    snip
    Is that better than:

    push @out, $_ unless /^\s*$/;
    snip

    They are functionally equivalent, but (at least on the version of perl
    I have) /\S/ is faster:
    Ok, I'll switch. Thanks.

    - Grant
  • Rob Dixon at Mar 13, 2007 at 6:51 pm

    Grant wrote:
    In this instance I have two blank lines in the delivered HTML
    between
    htmltag1 and htmltag2:

    <htmltag1></htmltag1>
    [ictag][/ictag]
    [ictag][/ictag]
    <htmltag2></htmltag2>

    If I use the filter like this:

    <htmltag1></htmltag1>[filter no_white]
    [ictag][/ictag]
    [ictag][/ictag]
    [/filter]<htmltag2></htmltag2>

    I get only one blank line, so it is an improvement. Should it be
    possible to remove the blank lines entirely?
    snip

    I may be crazy, but I see two lines with "[ictag][/ictag]" on them
    between "<htmltag1></htmltag1>" and "<htmltag2></htmltag2>". When
    most people on this list say "blank lines" we mean either a line with
    no characters other than the line-terminator (\n) or a line with
    whitespaces (tabs and spaces) followed by the line-terminator.
    I'm sorry, I should have explained myself better. The interchange
    tags (ictags) are parsed before the HTML is delivered. When they are
    parsed, a bunch of blank lines are left where they had been. BUT!
    The apache list pointed out to me that the Interchange::Link module I
    am using as the link between interchange and apache is delivering the
    content like this:

    while( <SOCK> ) {
    push @out, $_;
    }

    and I should be able to filter the blank lines most efficiently that
    way. This is an alternative to the [filter][/filter] method I had
    been working on. Can anyone show me how to regexp the blank lines out
    considering the above code?
    while( <SOCK> ) {
    push @out, $_ if /\S/;
    }
    Hi Rob,

    Is that better than:

    push @out, $_ unless /^\s*$/;
    I think it's simply more readable.

    Rob

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupbeginners @
categoriesperl
postedMar 12, '07 at 6:09p
activeMar 13, '07 at 6:51p
posts21
users7
websiteperl.org

People

Translate

site design / logo © 2022 Grokbase