元ネタは酢酸先生の、
から。
とりあえず、短冊メーカーなる基本的なものを作ってみた。
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 とか使って公開しようと思う。
以上。