//NOTE: 入れ子ではな。言い換えると開始~終了はセットではないことに注意。連続する開始は書き換えを意味し、終了はなしに戻る。 public IEnumerable<string> ReadLines(IEnumerable<string> lines) { foreach (var line in lines) { //同行字下げの処理 { var match = _oneLinePattern.Match(line); if (match.Success) { var indentAmount = ParseFullwidthNumber(match.Groups[2].Value); var stored = _currentIndent; _currentIndent = new ManualIndentSetting(indentAmount); yield return match.Groups[3].Value; _currentIndent = stored; continue; } } //範囲字下げの開始 { var match = _startPattern.Match(line); if (match.Success) { var indentAmount = ParseFullwidthNumber(match.Groups[1].Value); _currentIndent = new ManualIndentSetting(indentAmount); continue; } } //範囲字下げ(折り返しつき)の開始 { var match = _startOneTwoPattern.Match(line); if (match.Success) { var firstIndent = ParseFullwidthNumber(match.Groups[1].Value); var paragraphIndent = ParseFullwidthNumber(match.Groups[2].Value); _currentIndent = new ManualIndentSetting(firstIndent - paragraphIndent, paragraphIndent); continue; } } //範囲天付き(折り返しつき)の開始 { var match = _startZeroTwoPattern.Match(line); if (match.Success) { var paragraphIndent = ParseFullwidthNumber(match.Groups[1].Value); _currentIndent = new ManualIndentSetting(-paragraphIndent, paragraphIndent); continue; } } //範囲字下げの終了 if (_endPattern.IsMatch(line)) { _currentIndent = _noSetting; continue; } //全角空白による字下げの処理。範囲字下げ内では上書きでなく追加になる。 //同行に注記による指定がない環境のみ有効 //字下げなしの環境における一文字分の空白は、段落の目印と見做し、ここでは無視する //※段落のスタイルの別のところで指定する { var match = _headSpacePattern.Match(line); if (match.Success) { var moreIndentAmount = match.Groups[1].Value.Length; if (IsSetIndent && moreIndentAmount == 1) { yield return match.Groups[2].Value; } else { var stored = _currentIndent; _currentIndent = new ManualIndentSetting( _currentIndent.TextIndent + moreIndentAmount, _currentIndent.ParagraphIndent); yield return match.Groups[2].Value; _currentIndent = stored; } continue; } } yield return line; } }
//NOTE: 入れ子ではな。言い換えると開始~終了はセットではないことに注意。連続する開始は書き換えを意味し、終了はなしに戻る。 public IEnumerable <string> ReadLines(IEnumerable <string> lines) { foreach (var line in lines) { //同行字下げの処理 { var match = _oneLinePattern.Match(line); if (match.Success) { var indentAmount = ParseFullwidthNumber(match.Groups[2].Value); var stored = _currentIndent; _currentIndent = new ManualIndentSetting(indentAmount); yield return(match.Groups[3].Value); _currentIndent = stored; continue; } } //範囲字下げの開始 { var match = _startPattern.Match(line); if (match.Success) { var indentAmount = ParseFullwidthNumber(match.Groups[1].Value); _currentIndent = new ManualIndentSetting(indentAmount); continue; } } //範囲字下げ(折り返しつき)の開始 { var match = _startOneTwoPattern.Match(line); if (match.Success) { var firstIndent = ParseFullwidthNumber(match.Groups[1].Value); var paragraphIndent = ParseFullwidthNumber(match.Groups[2].Value); _currentIndent = new ManualIndentSetting(firstIndent - paragraphIndent, paragraphIndent); continue; } } //範囲天付き(折り返しつき)の開始 { var match = _startZeroTwoPattern.Match(line); if (match.Success) { var paragraphIndent = ParseFullwidthNumber(match.Groups[1].Value); _currentIndent = new ManualIndentSetting(-paragraphIndent, paragraphIndent); continue; } } //範囲字下げの終了 if (_endPattern.IsMatch(line)) { _currentIndent = _noSetting; continue; } //全角空白による字下げの処理。範囲字下げ内では上書きでなく追加になる。 //同行に注記による指定がない環境のみ有効 //字下げなしの環境における一文字分の空白は、段落の目印と見做し、ここでは無視する //※段落のスタイルの別のところで指定する { var match = _headSpacePattern.Match(line); if (match.Success) { var moreIndentAmount = match.Groups[1].Value.Length; if (IsSetIndent && moreIndentAmount == 1) { yield return(match.Groups[2].Value); } else { var stored = _currentIndent; _currentIndent = new ManualIndentSetting( _currentIndent.TextIndent + moreIndentAmount, _currentIndent.ParagraphIndent); yield return(match.Groups[2].Value); _currentIndent = stored; } continue; } } yield return(line); } }