Ejemplo n.º 1
0
        //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;
            }
        }
Ejemplo n.º 2
0
        //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);
            }
        }