etc.negui.system.text

NeGuiの文字列。
alias tchar;
alias tstring;
文字及び文字列。
struct _NTEXT(CHARACTER,C = Unqual!(CHARACTER),A = C[],S = immutable(C)[]) if (isSomeChar!(C));
文字列。
History:
1.120
  • features大幅書き直し, char, wchar, dcharに多分対応。
  • othersところどころHistoryがなくなったり更新されてないけど気にしない。
A data;

TypeInfo charType();
TypeInfo textType();
型。
_TEXT wrap(A arg );
ラップ。
tchar[]そのものをTextに取り込む。
Patams:
arg = 取り込む配列。
Returns:
ラップ後のText。
Examples:
 tstring src="abc";

 tchar[] buffer=src.dup;
 auto t=Text.wrap(buffer);

 t[2] = 'C';
 assert(buffer == "abC");
 assert(buffer is t.text);
History:
1.100
  • 新規作成。
const(_TEXT) iwrap(S arg );
ラップ。
Text.wrapの書き換えないバージョン。
History:
1.110
  • source属性変更(static pure ref -> static pure)。
1.100
  • 新規作成。
template toUTF(T = char,UtfString = immutable(T)[]) if (isSomeChar!(T))
History:
1.120
  • 新規作成。
template toStringz(T = char) if (isSomeChar!(T))
C形式文字列へ変換。
Returns:
終端0文字列。 それっぽいのはText.ptrを使用すべき。
History:
1.120
  • programtoUTFの利用。
1.110
  • programテンプレートへ変更。
string toANSI();

char* toANSIz();

_TEXT convertText(string AnsiString );

C* ptr(bool EmptyIsNull );
Windows用文字列の生成。
Params:
bool EmptyIsNull
trueの場合に文字列が空ならnullを返す。
Returns:
dataのC形式(0終端)文字列を生成。 誰かに渡さないとGCの対象になるんで注意。
History:
1.100
  • program挙動の変更。
  • source引数追加。
C* ptr();
Windows用文字列の生成。
Returns:
emptyIsNullに影響される。
int icmp(in _TEXT text );
文字列比較。
大文字小文字を区別しない。
Params:
_TEXT text
比較する文字列。
History:
1.100
  • source名前変更(cmpi -> icmp)。
1.00β11
  • 新規作成。
hash_t toHash();

bool opEquals(ref const _TEXT arg );

int opCmp(ref const _TEXT arg );

A TextFormat(...);

template opCall(T : dchar)
文字からText生成。
template opCall(T) if (isSomeChar!(T))
C形式文字列からText生成。
template opCall(T) if (is(T : IText))
クラスからText生成。
Params:
arg
変換するクラス。 ITextを継承していること。
template opCall(T) if (is(T == struct) && is(typeof(&T.init.toText)))
構造体からText生成。
Params:
arg
変換するクラス。 toTextを持っていること。
template opCall(T : _TEXT)
TextからText生成。
ただのコピー。
Params:
arg
変換するText。 arg.dup()を内部で呼び出し。
template opCall(T)
引数からText生成。
Params:
arg
何か。
Note:
引数属性がinなのでObject.toStringはできない。
クラスを変換する場合はITextを継承したクラスにしてText!(IText)を使用するか、 Text(String, T...)を使用する。
template opCall(String,T...)
書式からText作成。
_TEXT opCat(in _TEXT Value );
連結。
_TEXT opCatAssign(in _TEXT Value );
自身へ連結。
size_t length();

size_t length(size_t Length );

C opIndex(size_t Index );
[n]
C opIndexAssign(C Character , size_t Index );
[n] = value
A opIndex(size_t[] Index ...);

void opIndexAssign(C Character , size_t[] Index ...);

_TEXT opSlice();
[]
_TEXT opSlice(in size_t start , in size_t end );
[start .. end ]
History:
1.00β17
  • bug事前条件がDの仕様と違っていたのを修正。
dchar characterGet(size_t Position );

dchar characterSet(size_t Position , dchar Character );
template toArray(T)

bool validate();
Unicode文字列判定。
現在の文字列がUnicodeで合法かどうかを判定。
Returns:
Unicodeとして正しければtrue、不正ならfalse。
History:
1.100
  • 新規作成。
template toNumber(T,string _file = __FILE__,int _line = __LINE__) if (std.traits.isNumeric!(T))
数値変換。
現在の文字列からTに対応する数値を取得。
Returns:
Tに対応する数値。
Throws:
変換に失敗した場合はException。
Examples:
 auto t=Text("123");
 assert(t.toNumber!(int) == 123);
History:
1.100
  • 新規作成。
template tryNumber(T)
数値変換。
toNumberと違い例外出力を行わない。
Params:
Value
変換後の数値。
Returns:
変換成功の真偽値。
Examples:
 auto t=_TEXT("123");
 int result;
 if(t.tryNumber!(int)(result)) {
 	assert(result == 123);
 }
History:
1.100
  • 新規作成。
template numberSplit(T) if (isIntegral!(T))
数値に区切り追加。
1000を1,000のように変換。
Params:
number
変換する数値。
SplitChar
区切りにする文字。
SplitCount
SplitCharを設定する桁数。
Returns:
区切り文字の追加された文字列。
In:
SplitCount > 0
Examples:
 assert(Text.numberSplit(1000) == Text("1,000"));
 assert(Text.numberSplit(1000, '.') == Text("1.000"));
 assert(Text.numberSplit(1000, ',', 1) == Text("1,0,0,0"));
History:
1.100
  • 新規作成。
template toNumeral(T : int,BASE = int) if (!isSomeChar!(BASE))
template toNumeral(T : int,BASE = tchar) if (isSomeChar!(BASE))
数値をn進数に変換。
Params:
number
変換する数値。
n
変換するn進数。
c
n進数の最大値を表す文字。
Returns:
変換した文字列。
In:
n <= 2 とか。
History:
1.110
  • sourceテンプレートちまちま。
1.100
  • 新規作成。
template toNumeral10(T : int,BASE = int) if (!isSomeChar!(BASE))
template toNumeral10(T : int,BASE = tchar) if (isSomeChar!(BASE))
n進数から10進数へ変換。
Params:
number
変換する数値の文字列。
n
n進数。
c
n進数の最大値を表す文字。
History:
1.110
  • sourceテンプレートちまちま。
_TEXT chomp(in _TEXT Delimiter = _TEXT.init);
文字列からDelimiter削除。
Params:
_TEXT Delimiter
取り去る文字列。 Text.initならCR,LF,CRLF、
Returns:
処理後の文字列。
Note:
まんまstd.string.chomp
History:
1.100
  • source引数変更
_TEXT stripl();
先頭空白文字削除。
Returns:
処理後の文字列。
_TEXT stripr();
末尾空白文字削除。
Returns:
処理後の文字列。
_TEXT strip();
両端空白文字削除。
Returns:
処理後の文字列。
History:
1.010
  • source属性変更。
alias CASE_SENSITIVE;
大文字・小文字の区別。
alias START;
開始点。
_TEXT toUpperRaw();

_TEXT toLowerRaw();

_TEXT toUpper();

_TEXT toLower();

size_t count(C c );

size_t count(in _TEXT Word );

enum FILL;
埋めもの。
History:
1.110
  • 新規作成。
LEFT
左。
CENTER
中心。
RIGHT
右。
_TEXT fillRaw(FILL Fill , C c , size_t Width );
文字で埋める。
Textそのものに作用。
Params:
FILL Fill
元の文字列の配置。
C c
埋める文字。
size_t Width
最終的なサイズ。 FillがFILL.CENTERでWidthが奇数の場合、元の文字列は左寄り。
Returns:
埋められた文字列。 Widthが文字列より少ない場合は元の文字列。
History:
1.110
  • 新規作成。
_TEXT fill(FILL Fill , C c , size_t Width );
文字で埋める。
Params:
FILL Fill
元の文字列の配置。
C c
埋める文字。
size_t Width
最終的なサイズ。 FillがFILL.CENTERでWidthが奇数の場合、元の文字列は左寄り。
Returns:
埋められた文字列。 Widthが文字列より少ない場合は元の文字列。
History:
1.120
  • bugStack Overflow。
1.110
  • 新規作成。
int indexOf(C c , CASE_SENSITIVE CaseSensitive = CASE_SENSITIVE.YES, START Start = START.HEAD);
文字検索。
Params:
C c
検索する文字。
CASE_SENSITIVE CaseSensitive
大文字小文字の区別。
START Start
検索位置。
Returns:
見つかった場合はそのインデックス、 見つからなかった場合は-1を返す。
Examples:
 Text t;
 t = Text("123456789abcdABCD");

 assert(t.indexOf('1', CASE_SENSITIVE.YES, START.HEAD) == 0);
 assert(t.indexOf('9', CASE_SENSITIVE.YES, START.HEAD) == 8);
 assert(t.indexOf('a', CASE_SENSITIVE.YES, START.HEAD) == 9);
 assert(t.indexOf('A', CASE_SENSITIVE.YES, START.HEAD) == 13);

 assert(t.indexOf('1', CASE_SENSITIVE.NO, START.HEAD) == 0);
 assert(t.indexOf('9', CASE_SENSITIVE.NO, START.HEAD) == 8);
 assert(t.indexOf('a', CASE_SENSITIVE.NO, START.HEAD) == 9);
 assert(t.indexOf('A', CASE_SENSITIVE.NO, START.HEAD) == 9);

 assert(t.indexOf('D', CASE_SENSITIVE.YES, START.TAIL) == 16);
 assert(t.indexOf('d', CASE_SENSITIVE.NO, START.TAIL) == 16);
 assert(t.indexOf('1', CASE_SENSITIVE.NO, START.TAIL) == 0);
int indexOf(in _TEXT Word , CASE_SENSITIVE CaseSensitive = CASE_SENSITIVE.YES, START Start = START.HEAD);
文字検索。
Params:
_TEXT Word
検索する文字列。
CASE_SENSITIVE CaseSensitive
大文字小文字の区別。
START Start
検索位置。
Returns:
見つかった場合はそのインデックス、 見つからなかった場合は-1を返す。
Examples:
 Text t;
 t = Text("123456789abcdABCD");

 assert(t.indexOf(Text("1"), CASE_SENSITIVE.YES, START.HEAD) == 0);
 assert(t.indexOf(Text("abcd"), CASE_SENSITIVE.YES, START.HEAD) == 9);

 assert(t.indexOf(Text("1"), CASE_SENSITIVE.NO, START.HEAD) == 0);
 assert(t.indexOf(Text("12"), CASE_SENSITIVE.NO, START.HEAD) == 0);
 assert(t.indexOf(Text("ABCD"), CASE_SENSITIVE.NO, START.HEAD) == 9);
 assert(t.indexOf(Text("123456789abcdABCD"), CASE_SENSITIVE.NO, START.HEAD) == 0);
 assert(t.indexOf(Text("123456789abcdABCDE"), CASE_SENSITIVE.NO, START.HEAD) == -1);

 assert(t.indexOf(Text("12"), CASE_SENSITIVE.YES, START.TAIL) == 0);
 assert(t.indexOf(Text("23"), CASE_SENSITIVE.YES, START.TAIL) == 1);
 assert(t.indexOf(Text("abcd"), CASE_SENSITIVE.YES, START.TAIL) == 9);
 assert(t.indexOf(Text("ABCD"), CASE_SENSITIVE.NO, START.TAIL) == 13);
 assert(t.indexOf(Text("abcd"), CASE_SENSITIVE.NO, START.TAIL) == 13);
_TEXT[] split(in C c );
文字列分割。
Examples:
 Text t;
 Text[] list;

 t = Text("123 456 789");
 list = t.split(' ');
 assert(list.length == 3);
 assert(list[0].data == "123");
 assert(list[1].data == "456");
 assert(list[2].data == "789");

 t = Text("123,456,789,");
 list = t.split(',');
 assert(list.length == 4);
 assert(list[0].data == "123");
 assert(list[1].data == "456");
 assert(list[2].data == "789");
 assert(list[3].data == "");

 t = Text("");
 list = t.split(',');
 assert(!list.length);

 t = Text("123456789");
 list = t.split(',');
 assert(!list.length);

 t = Text("あ@い@う@え@お");
 list = t.split('@');
 assert(list.length == 5);

History:
1.00β14
  • 分割が変だったのを修正。
_TEXT[] split(in _TEXT Word );
文字列分割。
Examples:
 Text t;
 Text[] list;

 t = Text("123..456..789");
 list = t.split(Text(".."));
 assert(list.length == 3);
 assert(list[0].data == "123");
 assert(list[1].data == "456");
 assert(list[2].data == "789");

 t = Text("123....456..789");
 list = t.split(Text(".."));
 assert(list.length ==4);
 assert(list[0].data == "123");
 assert(list[1].data == "");
 assert(list[2].data == "456");
 assert(list[3].data == "789");

 t = Text("");
 list = t.split(Text(".."));
 assert(!list.length);

 t = Text("テキスト文字列data文字列てきすと");
 list = t.split(Text("文字列"));
 assert(list.length == 3);
 assert(list[0].data == "テキスト");
 assert(list[1].data == "data");
 assert(list[2].data == "てきすと");

 t = Text("abcdefg");
 list = t.split(Text(".."));
 assert(!list.length);
History:
1.100
  • source属性変更。
  • bug保持している文字列長が0でRange violation。
  • bug一致しない場合に戻り値がある。
1.00β14
  • 新規作成。
_TEXT[] splitLines();
改行分割。
Note:
std.string.splitlines。
History:
1.110
  • 名前, splitlines, splitLines
1.100
  • 新規作成。
_TEXT[] splitWhites();
空白分割。
History:
1.110
  • 新規作成。
_TEXT replaceRaw(in _TEXT SrcWord , in _TEXT NewWord );
文字列置き換え。
Textそのものに作用。
History:
1.100
  • 新規作成。
_TEXT replace(in _TEXT SrcWord , in _TEXT NewWord );
文字列置き換え。
History:
1.100
  • 新規作成。
_TEXT insertRaw(in _TEXT Word , size_t Index );
文字列挿入。
Textそのものに作用。
History:
1.100
  • 新規作成。
_TEXT insert(in _TEXT Word , size_t Index );
文字列挿入。
History:
1.100
  • 新規作成。
_TEXT repeat(in _TEXT Src , size_t Repeat );
文字列を繰り返す。
Params:
_TEXT Src
対象の文字列。
size_t Repeat
繰り返す回数。
Returns:
Src * Repeatの文字列。
History:
1.100
  • programRepeatが一回の場合にSrcを返すのではなくSrcのコピーを返す用に変更。
1.00β14
  • 新規作成。
_TEXT repeat(tchar c , size_t Repeat );
文字を繰り返す。
Params:
tchar c
繰り返す文字。
size_t Repeat
繰り返す回数。
Returns:
c * Repeatの文字列。
History:
1.100
  • 新規作成。
_TEXT repeat(size_t Repeat );
現在の文字列を繰り返す。
Params:
size_t Repeat
繰り返す回数。
Returns:
現在の文字列 * Repeatの文字列。
History:
1.050
  • 新規作成。
_TEXT quot(C Quot );

_TEXT quot(S Quot );

_TEXT quot(C left , C right );

_TEXT quot(S left , S right );

bool isNumeric(bool Separator = true);
文字列は数値か。
Params:
bool Separator
セパレータを無視するか。
Note:
std.string.isNumeric
_TEXT filter(in A Characters );
_TEXT filter(C Character , in A Characters ...);
該当文字を省く。
Params:
A Characters
フィルタとする文字。
Returns:
Charactersを取り除いたText。
_TEXT extract(in A Characters );
_TEXT extract(C Character , in A Characters ...);
該当文字の抽出。
bool startsWith(in _TEXT Word );
先頭文字列比較。
文字列の先頭が指定した文字列で始まっているかを調べる。
Params:
_TEXT Word
比較したい文字列。
History:
1.100
  • 新規作成。
bool endsWith(in _TEXT Word );
末尾文字列比較。
文字列の末尾が指定した文字列で終わっているか調べる。
Params:
_TEXT Word
比較したい文字列。
History:
1.100
  • 新規作成。
_TEXT join(in _TEXT[] texts , in _TEXT sep );

_TEXT getUnique(in _TEXT[] TextArray , in _TEXT Src );
History:
1.120
  • source所属変更(etc.negui.system -> etc.negui.system.NTEXT)。
  • source名前変更(GetUnique -> getUnique)。
1.100
  • source名前変更(GetNoneDouble -> GetUnique)。
1.090
  • 新規作成というかnemuxi.gui.window.dialog.settingdialog.groupdialogから独立。
alias CTEXT;

alias WTEXT;

alias DTEXT;

alias Text;

abstract interface IText;

abstract interface ITitleText;

abstract const Text text();

abstract void text(in Text);

template IsNTEXT(T)

template IsText(T)

struct TEXTNULLLIST;
NULL結合+終端NULL二つの文字列郡を作成。 Windowsへの橋渡し用。
BUGS:
汎用性を持たせるべき。
ToDo:
突貫工事。
History:
1.100
  • 新規作成。