コード例 #1
0
        public virtual IEnumerable <ParsedResult <BaseNumber> > Consume(IDataView data)
        {
            if (data.EndOfStream)
            {
                yield break;
            }

            var m = regex.Match(data.CurrentView.ToString());

            if (!m.Success)
            {
                yield break;
            }

            var rawNumber = m.Value;
            var number    = ParseRawNumber(rawNumber);

            if (!number.HasValue)
            {
                yield break;
            }

            yield return(new ParsedResult <BaseNumber>(
                             result: ConstructNumber(rawNumber, number.Value),
                             dataView: data.CloneByDelta(m.Index + m.Length)));
        }
コード例 #2
0
        public override IEnumerable <ParsedResult <BaseDecoratedNumber> > Consume(IDataView data)
        {
            if (data.EndOfStream)
            {
                yield break;
            }

            Match m;

            foreach (var numberResult in ConsumeNumber(data))
            {
                data = numberResult.DataView;
                var number = numberResult.Result;

                string delimiter;

                if (!(m = delimiterRegex.Match(data.CurrentView.ToString())).Success)
                {
                    if (number is RomanNumber &&
                        data.CurrentView.Length > 0 &&
                        beginWithAlphaRegex.IsMatch(data.CurrentView.Slice(0, 1).ToString()))
                    {
                        continue;
                    }

                    if ((number is ChineseNumber || number is ChineseIdeographNumber) &&
                        data.CurrentView.ToString().ReplaceBetween("[((]", "[))]").Length > 14)
                    {
                        continue;
                    }

                    if (number is ChineseNumber chNum && chNum.RawNumber == "两")
                    {
                        continue;
                    }

                    if (!blackNumberSuffix.IsMatch(data.CurrentView.ToString()))
                    {
                        yield return(new ParsedResult <BaseDecoratedNumber>(
                                         result: new UndecoratedNumber(number),
                                         dataView: data));
                    }

                    continue;
                }

                data      = data.CloneByDelta(m.Index + m.Length);
                delimiter = m.Value;

                yield return(new ParsedResult <BaseDecoratedNumber>(
                                 result: new DelimiterDecoratedNumber(number, number.RawNumber + delimiter, delimiter),
                                 dataView: data));
            }
        }
コード例 #3
0
        private string?ConsumeContentToSpaceOrEnd(ref IDataView data)
        {
            var m = _spaceRegex.Match(data.CurrentView.ToString());

            if (m.Success)
            {
                var res = data.CurrentView.Slice(0, m.Index + m.Length).ToString();
                data = data.CloneByDelta(m.Index + m.Length);
                return(res);
            }

            return(null);
        }
コード例 #4
0
        public override IEnumerable <ParsedResult <BaseDecoratedNumber> > Consume(IDataView data)
        {
            if (data.EndOfStream)
            {
                yield break;
            }

            string left;
            Match  m;

            if (!(m = leftBracketRegex.Match(data.CurrentView.ToString())).Success)
            {
                yield break;
            }

            data = data.CloneByDelta(m.Index + m.Length);
            left = m.Value.Trim();

            foreach (var numberResult in ConsumeNumber(data))
            {
                data = numberResult.DataView;
                var number = numberResult.Result;

                if (!(m = rightBracketRegex.Match(data.CurrentView.ToString())).Success)
                {
                    continue;
                }

                data = data.CloneByDelta(m.Index + m.Length);
                var right = m.Value.Trim();

                yield return(new ParsedResult <BaseDecoratedNumber>(
                                 result: new BracketDecoratedNumber(number, left + number.RawNumber + right, left, right),
                                 dataView: data));
            }
        }
コード例 #5
0
        private NumberNode?ExtractFromDataView(IDataView data, int paragraphOrder)
        {
            var content = new StringBuilder();

            var lastNode = ConsumeNumberFromDataView(ref data, paragraphOrder);

            if (lastNode == null)
            {
                return(null);
            }

            while (!data.EndOfStream)
            {
                // Skip Score
                var scoreMatch = _simpleScoreRegex.Match(data.CurrentView.ToString());
                if (scoreMatch.Success)
                {
                    content.Append(scoreMatch.Value);
                    data = data.CloneByDelta(scoreMatch.Length);
                }

                var currentContent = content.ToString();

                NumberNode?node = null;
                try
                {
                    node = ConsumeNumberFromDataView(ref data, paragraphOrder);
                }
                catch (FormatException)
                { }

                if (node != null)
                {
                    lastNode.Header = currentContent.Trim();
                    lastNode        = node;
                    content.Clear();
                }
                else
                {
                    content.Append(ConsumeContentToSpaceOrEnd(ref data));
                }
            }

            lastNode.Header = content.ToString().Trim();
            return(lastNode);
        }