C[] data;
この構造体の実体。
純然たる配列であり_NTEXT自身は配列の中身を常に監視しているわけではないため使用者がきちっと管理すべき。
bool emptyIsNull;
void toEmpty(bool EmptyIsNull
= false);
文字列を空に。
- Params:
- bool EmptyIsNull
- 空文字をnullとして扱うか。
_TEXT newline;
改行。
- Wrappers:
-
std.string.newline。
_TEXT wrap(C[] arg
);
ラップ。
tchar[]そのものを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);
const(_TEXT) iwrap(S arg
);
ラップ。
Text.wrapの書き換えないバージョン。
- History:
- 1.110
- source属性変更(static pure ref -> static pure)。
- 1.100
template toUTF(T = char,UtfString = immutable(Unqual!(T))[]) if (isSomeChar!(T))
指定ユニコード変換。
- Params:
- T
- char, wchar, dchar。
- Returns:
- Tに対応する文字列、
string, wstring, dstringを返す。
template toStringz(T = C) if (isSomeChar!(T))
C形式文字列へ変換。
- Returns:
- 終端0文字列。
それっぽいのはText.ptrを使用すべき。
- History:
- 1.130
- sourceTの初期値変更(char -> C)。
- 1.120
- 1.110
string str();
- Deprecated:
- toString, toUTFを使用すべき。
string toString();
string toString();
string変換。
toString呼んでその中でtoUTF!(char)してるだけ。
string toANSI();
char* toANSIz();
Windows 8bit文字コードのC形式文字列へ変換。
_TEXT convertText(string AnsiString
);
Windows 8bit文字コードからText生成。
template toTEXT(T,CHARACTER = Unqual!(T)) if (isSomeChar!(T))
指定文字の_NTEXTに変換。
- Params:
- T
- char, wchar, dchar。
_NTEXT!(CHARACTER) toTEXT();
指定文字の_NTEXTに変換。
- Params:
- T
- char, wchar, dchar。
C* ptr(bool EmptyIsNull
);
Windows用文字列の生成。
- Params:
- bool EmptyIsNull
- trueの場合に文字列が空ならnullを返す。
- Returns:
- dataのC形式(0終端)文字列を生成。
- Note:
-
Cに影響されずversionに影響されるようにしようかと考え中。
- History:
- 1.100
- program挙動の変更。
- source引数追加。
C* ptr();
Windows用文字列の生成。
- Returns:
- emptyIsNullに影響される。
_TEXT dup();
int icmp(in _TEXT text
);
文字列比較。
大文字小文字を区別しない。
- Params:
- _TEXT text
- 比較する文字列。
- Note:
-
大文字小文字を区別する場合はopCmpを参照。
- History:
- 1.130
- featuresstd.string.icmpがdstring対応したので流用。
- 1.100
- source名前変更(cmpi -> icmp)。
- 1.00β11
hash_t toHash();
bool opEquals(ref const _TEXT arg
);
int opCmp(ref const _TEXT arg
);
S TextFormat(...);
template opCall(T) if (isSomeChar!(T))
C形式文字列からText生成。
- History:
- 1.130
- featuresargがnullの場合にemptyIsNullをtrueに。
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。
TEXT.dup()を内部で呼び出し。
template opCall(T) if (isSomeString!(Unqual!(T)))
template opCall(T)
引数からText生成。
- Note:
-
引数属性がinなのでObject.toStringはできない。
クラスを変換する場合はITextを継承したクラスにしてText!(IText)を使用するか、
Text(String, T...)を使用する。
template opCall(String,T...)
書式からText作成。
- Params:
- SrcFormat
- 書式文字列。
std.format参照。
- Args
- いろいろ。
- String
- string, wstring, dstring, 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
);
C opIndexAssign(C Character
, size_t Index
);
C[] opIndex(size_t[] Index
...);
data[Index
[0], Index
[1], ..., Index
[$-1]]
void opIndexAssign(C Character
, size_t[] Index
...);
data[Index
[0], Index
[1], ..., Index
[$-1]] = Character
_TEXT opSlice();
_TEXT opSlice(in size_t start
, in size_t end
);
_TEXT at(size_t Index
);
size_t positionToIndex(c_pos Position
);
文字位置から配列のインデックス取得。
- Params:
- c_pos Position
- 文字の位置。
S characterToArray(dchar Character
);
dchar arrayToCharacter(in C[] Character
, ref size_t NextIndex
);
dchar arrayToCharacter(in C[] Character
);
dchar characterGet(c_pos Position
);
指定した文字の位置にある文字を取得。
文字数を考慮した取得であり文字の配列を基準とした通常の取得でないことに注意。
- History:
- 1.130
- sourcePositionの型変更(size_t -> c_pos)。
dchar characterSet(c_pos Position
, dchar Character
);
指定した文字の位置にある文字を別の文字で置き換える。
- History:
- 1.130
- sourcePositionの型変更(size_t -> c_pos)。
template toArray(T...)
template toArray(T)
bool validate();
Unicode文字列判定。
現在の文字列がUnicodeで合法かどうかを判定。
- Returns:
- Unicodeとして正しければtrue、不正ならfalse。
- Wrappers:
-
std.utf.validate。
size_t characterLength();
文字列長取得。
現在のUnicode文字列長を取得。
length()と違い文字列の長さを取得する。
template toNumber(T,string _file = __FILE__,int _line = __LINE__) if (std.traits.isNumeric!(T))
数値変換。
現在の文字列からTに対応する数値を取得。
- Throws:
- 変換に失敗した場合はException。
- Examples:
auto t=Text("123");
assert(t.toNumber!(int) == 123);
template tryNumber(T)
数値変換。
toNumberと違い例外出力を行わない。
- Examples:
auto t=_TEXT("123");
int result;
if(t.tryNumber!(int)(result)) {
assert(result == 123);
}
template numberSplit(T) if (isIntegral!(T))
数値に区切り追加。
1000を1,000のように変換。
- Params:
- number
- 変換する数値。
- SplitChar
- 区切りにする文字。
- SplitCount
- SplitCharを設定する桁数。
- 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"));
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進数の最大値を表す文字。
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進数の最大値を表す文字。
_TEXT chomp(in _TEXT Delimiter
= _TEXT.init);
文字列からDelimiter削除。
- Params:
- _TEXT Delimiter
- 取り去る文字列。
Text.initならCR,LF,CRLF、
- Wrappers:
-
std.string.chomp。
_TEXT stripl();
_TEXT stripr();
_TEXT strip();
alias CASE_SENSITIVE;
alias START;
_TEXT toUpperRaw();
_TEXT toLowerRaw();
_TEXT toUpper();
_TEXT toLower();
size_t count(C c
);
size_t count(in _TEXT Word
);
指定文字列をカウント。
- Params:
- _TEXT Word
- 数える文字列。
enum FILL;
_TEXT fillRaw(FILL Fill
, C c
, size_t Width
);
文字で埋める。
Textそのものに作用。
- Params:
- FILL Fill
- 元の文字列の配置。
- C c
- 埋める文字。
- size_t Width
- 最終的なサイズ。
FillがFILL.CENTERでWidthが奇数の場合、元の文字列は左寄り。
- Returns:
- 埋められた文字列。
Widthが文字列より少ない場合は元の文字列。
_TEXT fill(FILL Fill
, C c
, size_t Width
);
文字で埋める。
- Params:
- FILL Fill
- 元の文字列の配置。
- C c
- 埋める文字。
- size_t Width
- 最終的なサイズ。
FillがFILL.CENTERでWidthが奇数の場合、元の文字列は左寄り。
- Returns:
- 埋められた文字列。
Widthが文字列より少ない場合は元の文字列。
sizediff_t 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);
sizediff_t 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);
_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();
改行分割。
- Wrappers:
-
std.string.splitlines。
- History:
- 1.110
- source名前変更(splitlines -> splitLines)。
- 1.100
_TEXT[] splitWhites();
const(_TEXT) replaceToWord(C Head
, C Tail
, C Escape
, const(_TEXT) delegate(ref const _TEXT Word, out bool IsChanged) dg
, string _file
= __FILE__, int _line
= __LINE__);
const(_TEXT) replaceToWord(in _TEXT Head
, C Tail
, C Escape
, const(_TEXT) delegate(ref const _TEXT Word, out bool IsChanged) dg
, string _file
= __FILE__, int _line
= __LINE__);
文字列の特定文字列を置き換え。
一定の規則に従った文字列を抽出し、抽出部分を置き換える。
指定文字列は「先頭文字(列)該当文字列終端文字」の形式で抽出される。
先頭文字(列)を回避させたい場合は「抽出抑止文字先頭文字(列)」と指定する。
- Params:
- C Head
- 先頭文字(列)。
- C Tail
- 終端文字。
- C Escape
- 抽出抑止文字。
- const(_TEXT) delegate(ref const _TEXT Word, out bool IsChanged) dg
- 抽出部分置き換え処理。
- Params:
- Word
- HeadとTailに挟まれた文字列。
- IsChanged
- 戻り値を有効な値として使用するかの真偽値。
falseに設定した場合、Head
, Tailが付加された抽出文字をそのまま使用する。
- Returns:
- 指定文字列。
この値を使用するかどうかはIsChangedに依存する。
- Throws:
- Headに対してTailが不足していたり不正な場合はNeGuiBaseExceptionを投げる。
ただしdg内でそれ以外のをなんか投げるかも。
- Example:
-
const(Text) Replace(const ref Text Word, out bool IsChanged) {
if(Word.isNumeric) {
IsChanged = true;
return Text.toNumeral(Word.strip.toNumber!(int), 16);
} else if(Word.length >= 6){
IsChanged = true;
return Text("%s%s%s", Word[0], Text("..."), Word[Word.length - 1]);
} else if(Word.length == 1) {
IsChanged = true;
return Word.quote('\'');
}
IsChanged = false;
return Text.init; }
assert(Text("abcdefghijklmnopqrstuvwxyz").replaceToWord('<', '>', '<', &Replace) == Text("abcdefghijklmnopqrstuvwxyz"));
assert(Text("<abcdefghijklmnopqrstuvwxyz>").replaceToWord('<', '>', '<', &Replace) == Text("a...z"));
assert(Text("<1>, <10>, <15>, <16>, <255>").replaceToWord('<', '>', '<', &Replace) == Text("1, A, F, 10, FF"));
assert(Text("<A>, <AB>, <ABC>, <ABCD>, <ABCDE>, <ABCDEF>").replaceToWord('<', '>', '<', &Replace) == Text("'A', <AB>, <ABC>, <ABCD>, <ABCDE>, A...F"));
assert(Text("<<A>, <<10>, <<ABC>, <<ABCDEF>").replaceToWord('<', '>', '<', &Replace) == Text("<A>, <10>, <ABC>, <ABCDEF>"));
assert(Text("@<A>, @<10>, @<ABC>, @<ABCDEF>").replaceToWord('<', '>', '@', &Replace) == Text("<A>, <10>, <ABC>, <ABCDEF>"));
const(_TEXT) replaceEscapeSequence(C Target
, const(_TEXT) delegate(ref const _TEXT Word, out size_t ReadLength) dg
, string _file
= __FILE__, int _line
= __LINE__);
文字列のエスケープシーケンス的な置き換え。
- Params:
- C Target
- 対象文字。
二重の場合は無効。
- const(_TEXT) delegate(ref const _TEXT Word, out size_t ReadLength) dg
- 抽出部分置き換え処理。
- Params:
- Word
- 見つかったTarget以降の文字列。
- ReadLength
- Wordから読み進める文字数。
_TEXT replaceRaw(in _TEXT SrcWord
, in _TEXT NewWord
);
_TEXT replace(in _TEXT SrcWord
, in _TEXT NewWord
);
_TEXT insertRaw(in _TEXT Word
, size_t Index
);
_TEXT insert(in _TEXT Word
, size_t Index
);
_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
- 繰り返す回数。
_TEXT repeat(size_t Repeat
);
現在の文字列を繰り返す。
- Params:
- size_t Repeat
- 繰り返す回数。
- Returns:
- 現在の文字列 * Repeatの文字列。
_TEXT quote(C Quot
);
- History:
- 1.130
- source名前変更(quot -> quote)。
_TEXT quote(S Quot
);
- History:
- 1.130
- source名前変更(quot -> quote)。
_TEXT quote(C left
, C right
);
- History:
- 1.130
- source名前変更(quot -> quote)。
_TEXT quote(S left
, S right
);
- History:
- 1.130
- source名前変更(quot -> quote)。
bool isNumeric(bool Separator
= true);
文字列は数値か。
- Params:
- bool Separator
- セパレータを無視するか。
- Wrappers:
-
std.string.isNumeric。
_TEXT filter(in C[] Characters
);
_TEXT filter(C Character
, in C[] Characters
...);
該当文字を省く。
- Params:
- C[] Characters
- フィルタとする文字。
- Returns:
- Charactersを取り除いたText。
_TEXT extract(in C[] Characters
);
_TEXT extract(C Character
, in C[] Characters
...);
bool startsWith(in _TEXT Word
);
先頭文字列比較。
文字列の先頭が指定した文字列で始まっているかを調べる。
- Params:
- _TEXT Word
- 比較したい文字列。
bool endsWith(in _TEXT Word
);
末尾文字列比較。
文字列の末尾が指定した文字列で終わっているか調べる。
- Params:
- _TEXT Word
- 比較したい文字列。
_TEXT join(in _TEXT[] texts
, in _TEXT sep
);
_TEXT getUnique(in _TEXT[] TextArray
, _TEXT delegate(ref const _TEXT Source, size_t Index) dg
= null);
配列から一意の値を取得。
- Params:
- _TEXT[] TextArray
- 比較する配列。
- Source
- 一意の値に対する元の値。
- _TEXT delegate(ref const _TEXT Source, size_t Index) dg
- 比較・取得に使われるデリゲート。
nullの場合デフォルト動作を行う。
- Note:
-
単純にxxx(n)の形で値を取得するのが目的。
これstaticじゃなくてもいいかもしれんね。
- History:
- 1.130
- source引数dg追加。
- features値取得の方法を選択可能に。
- delete引数Src
- source属性変更(static -> 非static)。
- 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から独立。