Pot.Archive.AlphamericString

{String} Pot.alphamericStringEncode ({String} string)
{String} Pot.Archive.AlphamericString.encode ({String} string)
{String} Pot.alphamericStringDecode ({String} string)
{String} Pot.Archive.AlphamericString.decode ({String} string)

Pot.js で利用可能。 PotLite.js では利用できません。

引数 string を AlphamericString で圧縮/解凍します。

AlphamericString は、LZ77 アルゴリズムをベースに
任意の Unicode 文字列を [0-9A-Za-z_] のみからなる文字列に圧縮するアルゴリズムです。
圧縮/解凍ともにパフォーマンスがよく、結果が [0-9A-Za-z_] の 63 文字だけなので
URI や ID などにそのまま使用でき、Base64 より実用的な場合もあります。

Pot.Archive.AlphamericString はコンストラクタではなく、ただのオブジェクトです。
関数 encode, decode で実行できます。
encode は、Pot.alphamericStringEncode() として
decode は、Pot.alphamericStringDecode() としてアクセスできます。

{String} Pot.alphamericStringEncode ({String} string)
{String} Pot.Archive.AlphamericString.encode ({String} string)

引数 string を AlphamericString でエンコードして返します。
Pot.alphamericStringEncode() で実行できます。

[0-9A-Za-z_] のみからなる文字列に圧縮された文字列が返ります。

{String} Pot.alphamericStringDecode ({String} string)
{String} Pot.Archive.AlphamericString.decode ({String} string)

AlphamericString でエンコードされた文字列 string をデコードして返します。
Pot.alphamericStringDecode() で実行できます。

解凍された文字列が返ります。

Pot.globalize() が適応されている場合、
Pot.AlphamericString.encode() が alphamericStringEncode()、
Pot.AlphamericString.decode() が alphamericStringDecode() で、それぞれ実行できます。
適応されていない場合は、
Pot.alphamericStringEncode(), Pot.alphamericStringDecode() で実行できます。

var string = 'Hello Hello foooooooo baaaaaaaar';

var result = Pot.alphamericStringEncode(string);
var decode = Pot.alphamericStringDecode(result);

debug('string = ' + string + ' : length = ' + string.length);
debug('result = ' + result + ' : length = ' + result.length);
debug('decode = ' + decode + ' : length = ' + decode.length);
//
//   string = 'Hello Hello foooooooo baaaaaaaar' : length = 32
//   result = 'Y8Z5CCF_v56F__5X0Z21__5I'         : length = 24
//   decode = 'Hello Hello foooooooo baaaaaaaar' : length = 32
//
var string = 'Hello Hello こんにちは、こんにちは、にゃーにゃー';

var result = Pot.alphamericStringEncode(string);
var decode = Pot.alphamericStringDecode(result);

// バイト数を取得
var bytesS = Pot.utf8ByteOf(string);
var bytesR = Pot.utf8ByteOf(result);
var bytesD = Pot.utf8ByteOf(decode);

debug(
    'string='   + string +
    ', length=' + string.length +
    ', ' + bytesS + ' bytes'
);
debug(
    'result=' + result +
    ', length=' + result.length +
    ', ' + bytesR + ' bytes'
);
debug(
    'decode=' + decode +
    ', length=' + decode.length +
    ', ' + bytesD + ' bytes'
);
// -- 結果 --
//
//   string = 'Hello Hello こんにちは、こんにちは、にゃーにゃー',
//     length = 30,
//     66 bytes
//
//   result = 'Y8Z5CCF_v5cJeJdB1Fa1_v4dBe3hS_y1',
//     length = 32,
//     32 bytes
//
//   decode = 'Hello Hello こんにちは、こんにちは、にゃーにゃー',
//     length = 30,
//     66 bytes
//

encode/decode にはそれぞれ deferred というメソッドがあり、非同期で実行することが可能です。
非同期で実行することにより、巨大な文字列に対しても負荷を抑え実行することが可能です。

{Pot.Deferred} Pot.alphamericStringEncode.deferred ({String} string)
{Pot.Deferred} Pot.Archive.AlphamericString.encode.deferred ({String} string)

引数 string を AlphamericString で非同期でエンコードします。
エンコードされた結果を引数に持つ Pot.Deferred インスタンス が返ります。
Pot.alphamericStringEncode.deferred() で実行できます。
結果からは then() などによりチェインを繋げることができます。

Pot.alphamericStringEncode.deferred.slow() のようにして速度の指定ができます。
指定できる名前は以下の表を参照ください。
デフォルトの速度は normal です。

値 / メソッド名 速度
limp 最も遅い
doze 遅い
slow 遅め
normal 通常
fast 速め
rapid 速い
ninja 最も速い
{Pot.Deferred} Pot.alphamericStringDecode.deferred ({String} string)
{Pot.Deferred} Pot.Archive.AlphamericString.decode.deferred ({String} string)

AlphamericString でエンコードされた文字列 string を非同期でデコードします。
デコードされた結果を引数に持つ Pot.Deferred インスタンス が返ります。
Pot.alphamericStringDecode.deferred() で実行できます。
結果からは then() などによりチェインを繋げることができます。

Pot.alphamericStringDecode.deferred.slow() のようにして速度の指定ができます。
指定できる名前は以下の表を参照ください。encode と同じです。
デフォルトの速度は normal です。

値 / メソッド名 速度
limp 最も遅い
doze 遅い
slow 遅め
normal 通常
fast 速め
rapid 速い
ninja 最も速い
var string = 'Hello Hello foooooooo baaaaaaaar';
var encoded, decoded;

// 非同期で実行
Pot.alphamericStringEncode.deferred(string).then(function(res) {
    encoded = res;
    return Pot.alphamericStringDecode.deferred(encoded);
}).then(function(res) {
    decoded = res;
    debug('string = ' + string  + ' : length = ' + string.length);
    debug('result = ' + encoded + ' : length = ' + encoded.length);
    debug('decode = ' + decoded + ' : length = ' + decoded.length);
    //
    //   string = 'Hello Hello foooooooo baaaaaaaar' : length = 32
    //   result = 'Y8Z5CCF_v56F__5X0Z21__5I'         : length = 24
    //   decode = 'Hello Hello foooooooo baaaaaaaar' : length = 32
    //
});
var string, encoded, decoded;

string = 'Hello Hello こんにちは、こんにちは、にゃーにゃー';

// 非同期で実行
Pot.alphamericStringEncode.deferred(string).then(function(res) {
    encoded = res;
    Pot.alphamericStringDecode.deferred(res).then(function(res) {
        decoded = res;

        // バイト数を取得
        var bytesString  = Pot.utf8ByteOf(string);
        var bytesEncoded = Pot.utf8ByteOf(encoded);
        var bytesDecoded = Pot.utf8ByteOf(decoded);

        debug(
            'string=' + string +
            ', length=' + string.length +
            ', ' + bytesString + ' bytes'
        );
        debug(
            'result=' + encoded +
            ', length=' + encoded.length +
            ', ' + bytesEncoded + ' bytes'
        );
        debug(
            'decode=' + decoded +
            ', length=' + decoded.length +
            ', ' + bytesDecoded + ' bytes'
        );
        // -- 結果 --
        //
        // string='Hello Hello こんにちは、こんにちは、にゃーにゃー',
        //   length = 30,
        //   66 bytes
        //
        // result = 'Y8Z5CCF_v5cJeJdB1Fa1_v4dBe3hS_y1',
        //   length = 32,
        //   32 bytes
        //
        // decode='Hello Hello こんにちは、こんにちは、にゃーにゃー',
        //   length = 30,
        //   66 bytes
        //
    });
});