protected override bool NumberNodeVisitor_OnVisited(NumberNode node, int level, out List <ParagraphFormatException> exceptions)
        {
            exceptions = new List <ParagraphFormatException>();

            var m    = leftRegex.Match(node.Header);
            var data = new StringDataView(node.Header);

            while (m.Success)
            {
                data.Position = m.Index + m.Length;
                var numbers = _numberParser.Consume(data);
                if (numbers.Any())
                {
                    var number          = numbers.First();
                    var afterNumberData = number.DataView;
                    var rightMatch      = rightRegex.Match(afterNumberData.CurrentView.ToString());
                    if (rightMatch.Success)
                    {
                        node.SelectiveDescription = node.Header.Substring(
                            m.Index,
                            afterNumberData.Position + rightMatch.Index + rightMatch.Length - m.Index);
                        node.SelectCount = number.Result.IntNumber;

                        return(false);
                    }
                }

                m = m.NextMatch();
            }

            return(true);
        }
Exemplo n.º 2
0
        private NumberNode?ExtractFromParagraph(ParagraphPart paragraph)
        {
            paragraph = paragraph.TrimStart();
            var content = paragraph.Content;
            var data    = new StringDataView(content);

            return(ExtractFromDataView(data, paragraph.Order));
        }
        private bool IsChoiceQuestion(NumberNode node)
        {
            if (node.Children.Count > 1)
            {
                var firstChildNumber = node.Children.First().DecoratedNumber;
                if (firstChildNumber is UndecoratedNumber || firstChildNumber is DelimiterDecoratedNumber)
                {
                    if (firstChildNumber.Number is AlphabeticalNumber alphabeticalNumber &&
                        alphabeticalNumber.IsHalfWidth &&
                        !alphabeticalNumber.IsLower)
                    {
                        return(true);
                    }
                }
            }

            IDataView data = new StringDataView(node.Header);

            while (!data.EndOfStream)
            {
                var index = data.CurrentView.IndexOf("的");
                if (index == -1)
                {
                    return(false);
                }

                data = data.CloneByDelta(index + 1);
                var choiceCount = _lowerChineseNumberParser.Consume(data).SingleOrDefault();
                if (choiceCount != null)
                {
                    data = choiceCount.DataView;
                    if (_suffix.IsMatch(data.CurrentView.ToString()))
                    {
                        return(true);
                    }
                }
            }

            return(false);
        }