モノトーンの伝説日記

OBS Studio と Blackmagic Design が大好き。

<mini> 縦書きメーカー [TypeScript]、Thanks to 酢酸さん (@ch3cooh)

 元ネタは酢酸先生の、

ASP.NET MVC 4でjQueryを使って動的に部分ビューを更新させる 

から。

 とりあえず、短冊メーカーなる基本的なものを作ってみた。

class TextSupport
{
    static getCharArray( text: string ): string[]
    {
        var ret: string[] = [];

        var length = text.length;
        for( var i = 0; i < length; )
        {
            var char = text.charAt( i );
            var charCode = text.charCodeAt( i++ );
            if( charCode >= 0xd800 && charCode <= 0xdbff )
            {
                if( i < length )
                {
                    var charLow = text.charAt( i );
                    var charLowCode = text.charCodeAt( i );
                    if( charLowCode >= 0xdc00 && charLowCode <= 0xdfff )
                    {
                        ret.push( char + charLow );
                    }
                }
                ++i;
            }
            else
            {
                ret.push( char );
            }
        }

        return ret;
    }
}

class LeftRightToTopBottomConverter
{
    templateStart: string = "┏┷┓\n";
    templateEnd: string = "╰̚━┛⁾⁾\n";
    templateLeft: string = "┃";
    templateRight: string = "┃\n";

    convertTable: any[];

    constructor()
    {
        this.convertTable =
        [
            ["‥", "︰"],
            ["…", "︙"],
        ];
    }

    convert( from: string ): string
    {
        var ret = this.templateStart;

        var charArray = TextSupport.getCharArray( from );
        for( var i in charArray )
        {
            ret += this.templateLeft + this.replace( charArray[i] ) + this.templateRight;
        }

        ret += this.templateEnd;
        return ret;
    }

    replace( from: string ): string
    {
        for( var i in this.convertTable )
        {
            var fromTo = this.convertTable[i];
            if( from == fromTo[0] )
            {
                return fromTo[1];
            }
        }
        return from;
    }
}

 MIT ライセンスでお願いします。

 軽く解説。TextSupport はサロゲートペアのためのもの。たとえば「?」で使われている。サロゲートペアは JavaScript はサポートしていないので、2 つの文字データとしてコード上は扱われる。単純に扱いやすいように、文字列を文字列の配列にしている。確かに文字列ではなく数値として扱ったほうがより良いのだけど、String.fromCodePoint がサロゲートペアの文字羅列に対応してないので、本来のコードからの逆変換(サロゲートペア化)はできない。

 LR から TB 変換は、単純に 1 行変換。これから文字列の縦横変換は JSON 化してデータベース化してそれをもとに初期化できるようにしたり、1 行 X 文字とかして変換できるように実装を変えていくつもり。

 とりあえず、テストで書いてみただけでそれ以上でもそれ以下でもない。後日 Knockout.js とか使って公開しようと思う。

 以上。