Aion-Format
view release on metacpan or search on metacpan
lib/Aion/Format/Url.pm view on Meta::CPAN
_set_url_param $x, 1 unless $was_val;
\%param
}
#@category parse url
sub _parse_url ($) {
my ($link) = @_;
$link =~ m!^
( (?<proto> \w+ ) : )?
( //
( (?<user> [^:/?\#\@]* ) :
(?<pass> [^/?\#\@]* ) \@ )?
(?<domain> [^/?\#]* ) )?
( / (?<path> [^?\#]* ) )?
(?<part> [^?\#]+ )?
( \? (?<query> [^\#]* ) )?
( \# (?<hash> .* ) )?
\z!xn;
return %+;
}
# 1 - set / in each page, if it not file (*.*), or 0 - unset
use config DIR => 0;
use config ONPAGE => "off://off";
# ÐаÑÑÐ¸Ñ Ð¸ ноÑмализÑÐµÑ url
sub parse_url($;$$) {
my ($link, $onpage, $dir) = @_;
$onpage //= ONPAGE;
$dir //= DIR;
my $orig = $link;
my %link = _parse_url $link;
my %onpage = _parse_url $onpage;
if(!exists $link{path}) {
$link{path} = join "", $onpage{path}, $onpage{path} =~ m!/\z!? (): "/", $link{part};
delete $link{part};
}
if(exists $link{proto}) {}
elsif(exists $link{domain}) {
$link{proto} = $onpage{proto};
}
else {
$link{proto} = $onpage{proto};
$link{user} = $onpage{user} if exists $onpage{user};
$link{pass} = $onpage{pass} if exists $onpage{pass};
$link{domain} = $onpage{domain};
}
# ноÑмализÑем
$link{proto} = lc $link{proto};
$link{domain} = lc $link{domain};
$link{dom} = $link{domain} =~ s/^www\.//r;
$link{path} = lc $link{path};
my @path = split m!/!, $link{path}; my @p;
for my $p (@path) {
if($p eq ".") {}
elsif($p eq "..") {
#@p or die "ÐÑÑ
од за пÑÐµÐ´ÐµÐ»Ñ Ð¿ÑÑи";
pop @p;
}
else { push @p, $p }
}
@p = grep { $_ ne "" } @p;
if(@p) {
$link{path} = join "/", "", @p;
if($link{path} =~ m![^/]*\.[^/]*\z!) {
$link{dir} = $`;
$link{file} = $&;
} elsif($dir) {
$link{path} = $link{dir} = "$link{path}/";
} else {
$link{dir} = "$link{path}/";
}
} elsif($dir) {
$link{path} = "/";
} else { delete $link{path} }
$link{orig} = $orig;
$link{onpage} = $onpage;
$link{link} = join "", $link{proto}, "://",
exists $link{user} || exists $link{pass}? ($link{user},
exists $link{pass}? ":$link{pass}": (), '@'): (),
$link{dom},
$link{path},
length($link{query})? ("?", $link{query}): (),
length($link{hash})? ("#", $link{hash}): (),
;
return \%link;
}
# ÐоÑмализÑÐµÑ url
sub normalize_url($;$$) {
parse_url($_[0], $_[1], $_[2])->{link}
}
1;
__END__
=encoding utf-8
=head1 NAME
Aion::Format::Url - utilities for encoding and decoding URLs
=head1 SYNOPSIS
use Aion::Format::Url;
to_url_params {a => 1, b => [[1,2],3,{x=>10}]} # => a&b[][]&b[][1]=2&b[1]=3&b[2][x]=10
( run in 0.486 second using v1.01-cache-2.11-cpan-71847e10f99 )