Nobukazu Hanada
あるところでは、「サンタさん」というあだ名で呼ばれる事が在ります。 花田 (はなだ) 恒一(のぶかず)と申します。 恒一(こういち)とは読みません。 Lispが好きです。
~ガチのJS について~
キー入力
テキストデータ
テキスト表示
改行で区切り一行を配列で管理する
行を双方向リストで管理
ほどんどのエディタはこれ
行テキスト
行テキスト
行テキスト
動的な配列であり、編集箇所にGapをつくるデータ構造。
テキストエディタの編集箇所は基本的には局所化している。
Emacsがこれ。
はやい。でも行情報は別途管理が必要。
Gap
Gap
テキストデータ
テキストデータ
テキストデータ
export class PieceTreeBase {
root!: TreeNode; // 赤黒木
protected _buffers!: StringBuffer[]; // 文字列のバッファ
....
export class TreeNode {
parent: TreeNode; // 親
left: TreeNode; // 左の子
right: TreeNode; // 右の子
color: NodeColor; // 赤黒木の色
piece: Piece; //
size_left: number; // 左の木のサイズ
...
export class Piece {
readonly bufferIndex: number; // バッファインデックス
readonly start: BufferCursor; // バッファの最初の位置
readonly end: BufferCursor; // バッファの最後の位置
readonly length: number; //長さ
..
行頭にabcを挿入
abc
String Buffer
テキストデータ
abc
aのあとに123を挿入
a123bc
abc123
3bを削除
a12c
abc123
aの前にxyz-を挿入
xyz-a12c
a12cxyz-
OK! Google ! Yes We Can!!!!!
StringBuffer
4
15
Piece
PieceはStringBufferの
文字列の始まりの位置と終わりの位置をもつ
StringBuffer
kick base World Hello Nobukazu Hanada .
11
15
17
21
23
31
33
38
Piece0
Piece1
Piece2
Piece3
39
Piece4
Hello World Nobukazu Hanada .
テキストデータ
By Nobukazu Hanada
あるところでは、「サンタさん」というあだ名で呼ばれる事が在ります。 花田 (はなだ) 恒一(のぶかず)と申します。 恒一(こういち)とは読みません。 Lispが好きです。