Pcore

 view release on metacpan or  search on metacpan

lib/Pcore/Util/MIME.pm  view on Meta::CPAN

package Pcore::Util::MIME;

use Pcore -export;
use Pcore::Util::Scalar qw[is_plain_arrayref];

our $DATA;

sub _load_data {
    if ( !defined $DATA ) {
        $DATA = $ENV->{share}->read_cfg('/Pcore/data/mime.yaml');    ## no critic qw[Variables::RequireLocalizedPunctuationVars]

        state $get_tags = sub ($data) {
            my $type = shift $data->@*;

            push $data->@*, split m[/]sm, $type, 2;

            my $tags = { map { $_ => 1 } $data->@* };

            # text types can be compressed
            $tags->{compress} = 1 if exists $tags->{text};

            return $type, $tags;
        };

        for my $key (qw[custom_suffix filename suffix]) {
            for my $name ( keys $DATA->{$key}->%* ) {
                $DATA->{$key}->{$name} = [ $get_tags->( $DATA->{$key}->{$name} ) ];
            }
        }

        # compile shebang
        for ( my $i = 0; $i <= $DATA->{shebang}->$#*; $i++ ) {
            my $re = shift $DATA->{shebang}->[$i]->@*;

            $DATA->{shebang}->[$i] = [ qr/$re/m, $get_tags->( $DATA->{shebang}->[$i] ) ];    ## no critic qw[RegularExpressions::RequireDotMatchAnything]
        }
    }

    return;
}

sub update {
    print 'updating mime.yaml ... ';

    my $res = P->http->get('https://svn.apache.org/viewvc/httpd/httpd/trunk/docs/conf/mime.types?view=co');

    if ($res) {
        my $data = $ENV->{share}->read_cfg('/Pcore/data/mime.yaml');

        my $suffixes = $data->{suffix};

        for my $line ( split /\n\r?/sm, $res->{data}->$* ) {
            next if $line =~ /\A\s*#/sm;

            my @tokens = split /\s+/sm, $line;

            my $type = shift @tokens;

            for my $suffix (@tokens) {
                if ( !exists $suffixes->{$suffix} ) {
                    $suffixes->{$suffix} = [$type];
                }
                elsif ( $suffixes->{$suffix}->[0] ne $type ) {
                    $suffixes->{$suffix}->[0] = $type;

                    # TODO update type in custom_suffix, filename, shebang branches
                }
            }
        }

        $ENV->{share}->write( '/Pcore/data/mime.yaml', $data );

        undef $DATA;
    }



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