タグ別アーカイブ: Middleware

MojoliciousアプリにPlack::Middlewareをプラグインするプラグイン

レスポンスフィルター系のPlack::Middleware::*をMojoliciousのafter_dispachフックにねじ込むプラグインMojolicious-Plugin-PlackMiddlewareです。そんなニーズない?

MojoX::Tusuで古いウェブサイトを移植するとき、/mobile/なんてディレクトリがあったら、「Plack-Middleware-ForceCharset」で強制的にShift_JISで出力するとかしたい。現状でもソースでauto_detectするオプションがあるからいいんだけど、明示的にしたい。

enable_ifっぽい判定もできるようにしたので、きっとできると思う。

use MojoX::Util::ResponseFilter 'enable';

sub startup {

    my $self = shift;

    $self->plugin('plack_middleware', [
        'Plack::Middleware::Some1',
        'Plack::Middleware::Some2', {arg1 => 'some_vale'},
        'Plack::Middleware::ForceCharset', sub {
            my $c = shift;
            if (ルートが/mobile/だったら) {
                return 1;
            }
        }, {charset => 'Shift_JIS'},
    ]);
}

 

モバイル用にHTMLを圧縮するPlack::Middlewareらしきもの

HTMLソースを携帯用に圧縮するPlack::Middlewareらしきもの。スペースや改行を削除するのと、全角→半角変換などを適当にやってくれる。絵文字はできてない。

package Plack::Middleware::KetaiMinimize;
use strict;
use warnings;
use Lingua::JA::Regular::Unicode;
our $VERSION = '0.01';
use utf8;
use Encode;
use Encode::JP::Emoji;
use Encode::JP::Emoji::Property;
use base qw( Plack::Middleware );
use Plack::Util;

sub call {

    my $self = shift;
    my $res = $self->app->(@_);
    $self->response_cb($res, sub {
        my $res = shift;
        my $h = Plack::Util::headers($res->[1]);
        if ($h->get('Content-Type') =~ 'text/html') {
            return sub {
                my $chunk = shift;
                if (! defined $chunk) {
                    return;
                }
                $chunk =~ s{(rn|r|n|s)+}{ }g;
                $chunk =~ s{(^|>)([^<]+)}{
                    my $a = $1;
                    my $b = Lingua::JA::Regular::Unicode::katakana_z2h($2);
                    $b =~ tr{-}{0-9};
                    $b =~ tr{、。()!?}{、。()!?};
                    if ($b eq ' ') {
                        $a;
                    } else {
                        $a. $b;
                    }
                }ge;
                #$chunk = emoji_conv($chunk);
                return $chunk;
            };
        }
        $res;
    });
}