Group
Extension

Acme-VOYAGEGROUP-ConferenceRoom/lib/Acme/VOYAGEGROUP/ConferenceRoom.pm

package Acme::VOYAGEGROUP::ConferenceRoom;
use 5.008005;
use strict;
use warnings;
use Carp;
use utf8;
use UNIVERSAL::require;
use parent 'Exporter';

binmode STDOUT, ":utf8";
binmode STDERR, ":utf8";

our $VERSION = "0.01";
our @EXPORT = qw/ conference_room /;

use constant FLOOR_PLAN => <<'EOS';
.---------------.---------------------.
|               |                     |
|               |      .--.--.----.---|
|               |      |  |  |    |   |
|               |---.  |  |--|    |   |
|               |   |  '--'  '----|   |
|               |---'-.          .'---|
|               |     |          |    |
'---------------'-----'.--.--.  .'----|
                       |     |  |     |
                       |--.--|  |--.--|
                       |  |  |  |  |  |
                       '--'--'  '--'--|
                                      |
                         .------------|
                         |            |
                         |            |
                         '------------'
EOS

my %PROCESS_OF = (
    pangea => {
        lines         => [1..7],
        normalization => qr/^ぱんげあ|パンゲア$/ms,
        position      => qr{ ^(\|/*)\s }x,
        direction     => 'head',
    },
    megallanica => {
        lines         => [3..4],
        normalization => qr/^めがらにか|メガラニカ$/ms,
        position      => qr{ ^(\|\s+\|[^\|]+\|/*)\s }x,
    },
    mu => {
        lines         => [3],
        normalization => qr/^むー|ムー$/ms,
        position      => qr{ \s(/*\|\s+\|\s+\|)$ }x,
    },
    ultima => {
        lines         => [5],
        normalization => qr/^うるてぃま|ウルティマ$/ms,
        position      => qr{ ^(\|\s+\|/*)\s }x,
    },
    atlantis => {
        lines         => [3..4],
        normalization => qr/^あとらんてぃす|アトランティス$/ms,
        position      => qr{ \s(/*\|\s+\|)$ }x,
    },
    pacifis => {
        lines         => [3..5],
        normalization => qr/^ぱしふぃす|パシフィス$/ms,
        position      => qr{ \s(/*\|)$ }x,
    },
    zipang => {
        lines         => [7],
        normalization => qr/^じぱんぐ|ジパング$/ms,
        position      => qr{ ^(\|\s+\|/*)\s }x,
    },
    lemuria => {
        lines         => [7],
        normalization => qr/^れむりあ|レムリア$/ms,
        position      => qr{ \s(/*\|)$ }x,
    },
    africa => {
        lines         => [9],
        normalization => qr/^あふりか|アフリカ$/ms,
        position      => qr{ \s(/*\|\s+\|\s+\|)$ }x,
    },
    eurasia => {
        lines         => [9],
        normalization => qr/^ゆーらしあ|ユーラシア$/ms,
        position      => qr{ \s(/*\|)$ }x,
    },
    north_america => {
        lines         => [11],
        normalization => qr/^のーすあめりか|ノースアメリカ$/ms,
        position      => qr{ \s(/*\|)$ }x,
    },
    south_america => {
        lines         => [11],
        normalization => qr/^さうすあめりか|サウスアメリカ$/ms,
        position      => qr{ \s(/*\|\s+\|)$ }x,
    },
    australlia => {
        lines         => [11],
        normalization => qr/^おーすとらりあ|オーストラリア$/ms,
        position      => qr{ \s(/*\|\s+\|\s+\|\s+\|)$ }x,
    },
    antarctica => {
        lines         => [11],
        normalization => qr/^あんたーくてぃか|アンタークティカ$/ms,
        position      => qr{ \s(/*\|\s+\|\s+\|\s+\|\s+\|)$ }x,
    },
    ajito => {
        lines         => [15..16],
        normalization => qr/^あじと|アジト$/ms,
        position      => qr{ \s(/*\|)$ }x,
    },
);

my %OUTPUT_OF = (
    color        => 'Acme::VOYAGEGROUP::ConferenceRoom::Output::Color',
    json         => 'Acme::VOYAGEGROUP::ConferenceRoom::Output::JSON',
    xml          => 'Acme::VOYAGEGROUP::ConferenceRoom::Output::XML',
    message_pack => 'Acme::VOYAGEGROUP::ConferenceRoom::Output::MessagePack',
);

sub conference_room {
    my $room_name = shift or croak "Conference Room Not Found";
    my $output_type = shift || 'color';

    $room_name = _normalize($room_name);
    my $process = $PROCESS_OF{$room_name};
    croak "Conference Room Not Found: $room_name" unless $process;

    croak "Mistake Position: $process->{position}" if $process->{position} !~ m/\s(\^?).+?(\$?)\s/xms;
    my @lines = split "\n", FLOOR_PLAN;
    my($head, $tail) = ($1) ? ('', '/') : ('/', '');
    for my $i (@{ $process->{lines} }) {
        1 while $lines[$i] =~ s{$process->{position}}{$head$1$tail};
    }

    if ($output_type ne 'none') {
        my $module = $OUTPUT_OF{$output_type};
        croak "No Type: $output_type" unless $module;

        return $module->convert(\@lines) if $module->use;
    }

    join "\n", @lines;
}

sub _normalize {
    my $room_name = shift;

    for my $normalized_room_name (keys %PROCESS_OF) {
        return $normalized_room_name
            if $room_name =~ $PROCESS_OF{$normalized_room_name}->{normalization};
    }

    lc($room_name);
}

1;
__END__

=encoding utf-8

=head1 NAME

Acme::VOYAGEGROUP::ConferenceRoom - It's new $module

=head1 SYNOPSIS

    use Acme::VOYAGEGROUP::ConferenceRoom;

=head1 DESCRIPTION

Acme::VOYAGEGROUP::ConferenceRoom is ...

=head1 LICENSE

Copyright (C) monmon.

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=head1 AUTHOR

monmon E<lt>lesamoureuses@gmail.comE<gt>

=cut



Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.