private void WritePrefix() { // write prefix by state WritingState currentState = this.state.Peek(); switch (currentState) { case WritingState.Value: break; case WritingState.ArrayStart: this.state.Pop(); this.state.Push(WritingState.Array); break; case WritingState.ObjectStart: this.state.Pop(); this.state.Push(WritingState.Object); break; case WritingState.Array: case WritingState.Object: this.writer.Write(','); break; case WritingState.ObjectPropertyName: this.state.Pop(); this.writer.Write(':'); break; default: break; } }
//開始タグ適用(未対応のタグの場合はfalseを返す) private bool applyStartTag(TagReader.StartTag aTag) { switch (aTag.mTagName) { case "clear": //表示削除 clear(); return(true); case "stop": //停止 mWritingState = WritingState.stop; return(true); case "next": //停止、再開時に表示削除 mWritingState = WritingState.waiteNext; return(true); case "waite": //指定秒数停止 mWritingState = WritingState.waite; this.setTimeout(float.Parse(aTag.mArguments[0]), () => { if (mWritingState == WritingState.waite) { mWritingState = WritingState.writing; } }); return(true); default: return(false); } }
//<summary>表示を停止するところまで表示、もしくは停止を解除し続きを表示</summary> public void read() { switch (mWritingState) { case WritingState.writing: //追記中 //停止するまでスキップ while (mWritingState == WritingState.writing) { next(); } return; case WritingState.stop: //停止中 //続きを表示 mElapsedTime = 0; mWritingState = WritingState.writing; return; case WritingState.waiteNext: //ページ送り待ち中 //表示削除してから続きを表示 clear(); mElapsedTime = 0; mWritingState = WritingState.writing; return; case WritingState.waite: //待ち中 return; case WritingState.end: //表示完了済み return; } }
//<summary>次の1文字を表示</summary> public void next() { while (true) //1文字表示するまでループ { if (mWritingState != WritingState.writing) { return; //表示停止中 } if (mReader.isEnd()) { //全て表示終了している mWritingState = WritingState.end; //読み終わりコールバック if (mOnRead != null) { mOnRead(); } } //次の1文字もしくはタグを読んで表示 TagReader.Element tElement = mReader.read(); if (tElement is TagReader.OneChar) { //文字1文字 mBoard.addText(((TagReader.OneChar)tElement).mChar); return; } else if (tElement is TagReader.StartTag) { //開始タグ if (!applyStartTag((TagReader.StartTag)tElement)) { mBoard.addText(((TagReader.StartTag)tElement).mOriginalString); } continue; } else if (tElement is TagReader.EndTag) { //終了タグ if (!applyEndTag((TagReader.EndTag)tElement)) { mBoard.addText(((TagReader.EndTag)tElement).mOriginalString); } continue; } } }
public TextEditor(WritingState state) => this.state = state;
///<summary>テキストを表示(既に表示されているテキストはそのまま)</summary> public void display(string aText) { mReader = new TagReader(aText); mElapsedTime = 0; mWritingState = WritingState.writing; }